In [42]:
import numpy as np
N = 2000
v = np.linspace(-1, 1, 1000)
dv = 2.0/len(v)
def make_gaussian(centre, sigma):
return np.exp(-(v-centre)**2/(2*sigma**2))
encoders = [make_gaussian(centre=np.random.uniform(-1, 1),
sigma=np.random.uniform(0.03, 0.07)) for i in range(N)]
encoders = np.array(encoders)
plot(v,encoders[:30].T)
show()
In [47]:
U, S, V = np.linalg.svd(encoders.T)
basis = U/(np.sqrt(dv))
bases = 40
basis = U[:,:bases]/(np.sqrt(dv))
def func_to_vector(f):
return np.dot(f, basis)*dv
def vector_to_func(v):
return np.dot(basis, v.T)
plot(v, basis[:,:5])
#plot(S)
show()
In [16]:
e_vector = func_to_vector(encoders)
for i in range(N):
norm = np.linalg.norm(e_vector[i])
e_vector[i]/=norm
In [23]:
import nengo.utils.functions
xx = nengo.utils.functions.whitenoise(0.1, 3)
plot(v, xx(v))
Out[23]:
In [24]:
#x = [make_gaussian(centre=np.random.uniform(-1, 1),
# sigma=np.random.uniform(0.1, 0.15)) for i in range(1000)]
x = [nengo.utils.functions.whitenoise(0.1, 3)(v) for i in range(1000)]
x = np.array(x)
x_vector = func_to_vector(x)
plot(v,x[:30].T)
show()
In [40]:
def pulse_in(t):
if 0.05 < t < 0.15:
return func_to_vector(xx(v))
else:
return [0]*bases
import nengo
model = nengo.Network()
with model:
input = nengo.Node(pulse_in)
a = nengo.Ensemble(N, bases, encoders=e_vector, eval_points=x_vector)
nengo.Connection(input, a)
nengo.Connection(a, a, synapse=0.1)
probe = nengo.Probe(a, synapse=0.1)
sim = nengo.Simulator(model)
sim.run(5)
data = vector_to_func(sim.data[probe])
import pylab
pylab.imshow(data, aspect='auto')
#pylab.plot(v, data[:,-1])
pylab.show()
In [41]:
pylab.plot(v, data[:,150], label='150ms')
pylab.plot(v, data[:,500], label='500ms')
pylab.plot(v, data[:,2000], label='2000ms')
pylab.plot(v, data[:,4999], label='5000ms')
pylab.legend(loc='best')
pylab.show()
In [ ]: