Last active
August 29, 2015 14:07
-
-
Save mundya/f25e4f99a421e314ce28 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"metadata": { | |
"name": "", | |
"signature": "sha256:2a752b543b88fd7b9bfa575b1ec997c0187d6a94b9a07c4a4ca0cc48d9b6ae53" | |
}, | |
"nbformat": 3, | |
"nbformat_minor": 0, | |
"worksheets": [ | |
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"%matplotlib inline\n", | |
"import numpy as np\n", | |
"import scipy.optimize\n", | |
"from matplotlib import pyplot as plt\n", | |
"import seaborn as sns\n", | |
"import fwm_utils as neurons\n", | |
"\n", | |
"np.random.seed(2909)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stderr", | |
"text": [ | |
"/usr/lib/python2.7/site-packages/pandas/io/excel.py:626: UserWarning: Installed openpyxl is not supported at this time. Use >=1.6.1 and <2.0.0.\n", | |
" .format(openpyxl_compat.start_ver, openpyxl_compat.stop_ver))\n" | |
] | |
} | |
], | |
"prompt_number": 1 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Effect of factoring weight matrices on interspike intervals (ISI)\n", | |
"## Illustration of experiment\n", | |
"\n", | |
"Generate a random population of neurons and a weight matrix. Connect the pre-synapses to a selection of random sources and determine the characteristics of the post-synaptic neuron spiking." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"pop = neurons.generate_population(100, 0.02, 0.002, 75)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 2 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"wm_full = np.zeros((100, 100))\n", | |
"wm_full[np.random.uniform(size=(100, 100)) < 0.75] = 0.05" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 3 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Generate a set of input spikes for 1 second of simulation at 1msec intervals:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"inputs = np.zeros((100, 1000))\n", | |
"inputs[np.random.uniform(size=(100, 1000)) < 0.05] = 1." | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 4 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Simulate the neurons for this period of time and get the interspike intervals." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"full_spikes = neurons.simulate_feedforward(pop, inputs, wm_full)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 5 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Now we factorise the weight matrix:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"k = 5\n", | |
"\n", | |
"U, s, V = np.linalg.svd(wm_full, full_matrices=True)\n", | |
"e = s[:k] * U[:,:k]\n", | |
"d = V[:k,:]\n", | |
"\n", | |
"wm_factored = e.dot(d)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 6 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"factored_spikes = neurons.simulate_feedforward(pop, inputs, wm_factored)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 7 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"fig, [ax1, ax2] = plt.subplots(1, 2, sharey=True, figsize=(10, 4))\n", | |
"ax1.eventplot(full_spikes, colors=[[0, 0, 1]]);\n", | |
"ax2.eventplot(factored_spikes, colors=[[0, 0, 1]]);\n", | |
"ax1.set_xlim(0, 1); ax2.set_xlim(0, 1);\n", | |
"ax1.set_ylim(0, 100); ax2.set_ylim(0, 100);\n", | |
"ax1.set_title('Full WM'); ax2.set_title('Factored WM');\n", | |
"ax1.set_xlabel('Neuron'); ax1.set_xlabel('Time / s'); ax2.set_xlabel('Time / s');\n", | |
"fig.tight_layout()" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "display_data", | |
"png": "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\n1o75+zIf50N6kiRJUkfFjCAv+0WwqZ8v+0U7RHlsg2E+X3cXYcyfr/qFv2h0q899pqxn1zIOsczb\nJvYlqz5ftJxkSeW0n13+uW2Q5vNVy7yVUsbceTuCLEmSJHVU9Ahy379I+vylk+oX3dhiq59XXxJR\nQtn6jm0yqlFyPbp83mYEuYS+IkUe+/vHe5+DvCl9apPYZX1tCWXrI3bdHOxtOCfq3kUovR5tY5te\nbwxd3hz7cwRZkiRJ6qiYEeRllv1a6Bo7dN65V3BoG99nOVI8XV1afJN8m6xk0ib/3PEp8h7iFbAl\n5T3WV02X1Ibb0Nd2iR/b69xzxLbpa5uWpWl8n2VZ9be2Tf4ltWPdeEeQJUmSpI68QJYkSZIqippi\nsW6YfNX2sWybbV/00EBpZc1Zf1h866/pJP4u6YY+35rc+t2EbYu217n1OfRxyrltqCkWJdS967a6\naZv0M0OUddvr38e2betrV01nHLosQ21zioUkSZLUUREjyE1+Waf+bKj9rBo5G0N9Uux7fhS9pOPT\nx2c5lzgbS1t0WX5pDPVeF1vCMm9DnwO5952rry2tLZd9vmg5yTHUJ+W+U5wDY6z3TJdzYMz1rn7m\nCLIkSZLUUREjyMusmmeSM66PPFMuu1J63LL4FEt81Ykd8riviutr+amSvx9Nl18quS5t9l3KMm+b\n1P7zsev62rGcKznqb187/PnZR545lxQdS/s4gixJkiR1VPQIMnQfpRwq73Xxi37VD1mernm3SbPs\nVcsp8h5D/FhelJLzvCnlHMh9vi+LLWUEGcpqX/vadPFNvmN9lGfb+tqmaXKUp68XpbRJ09d3yxFk\nSZIkqaPzU2UUQtgBfhp4KPBR4Bkxxj/umu/BwTn294+zv3+80a+YMWpS1zGPaMziT5+Gs2eHHcHs\nqx2Hjp8vd5P4lLHz8Xfeuf4c6KvN68jZLipTH6NuucqSM3/72nrx1f/vGts2fmcHTp1Km/ey47Mo\nzapj2TW+ad5NpBxB/gbgwhjjFcD3AzckzFuSJEnqRcoL5EcBbwCIMb4DeHjCvCVJkqRepLxAvgi4\nu/LvT0ynXXSS+5ZSSeVoso9ZzCxNyviceVfjT5yoFZ697NWpLUOXpWl83bJXbw02iU8dOx9f5xwo\nrc1zlUWbIedxL+mcyv1dy2nMZdenG8WxCSHcEEL4psq/zwxZHkmSJKmNlCPItwFfCxBCeCTw7oR5\n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\nAABJRU5ErkJggg==\n", | |
"text": [ | |
"<matplotlib.figure.Figure at 0x7f2c9e2c5ad0>" | |
] | |
} | |
], | |
"prompt_number": 8 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"fig, [ax0, ax1] = plt.subplots(1, 2)\n", | |
"ax0.matshow(wm_full);\n", | |
"ax1.matshow(wm_factored);\n", | |
"ax0.set_xticks([]); ax0.set_yticks([]); ax1.set_xticks([]); ax1.set_yticks([]);\n", | |
"ax0.set_title('Full WM'); ax1.set_title('Factored WM');\n", | |
"fig.tight_layout();" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "display_data", | |
"png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAAE4CAYAAABWnYlrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXncXGV5/i/XbthWq7VVbFFgKIssgaCyJSEhECAQNgkQ\nFgNhB0VEJUTZKdAKCMgmO4Q97AQIBIJAEkDCvjgudYFWa63W2p+1tfL7I7me+Z73PfPOOWfOTOJw\nX58PH26emfOcZzsvc+7rvq9bCgQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKB\nQCAQCAQCgUAgEAgEAoHA7xHesrwHEOgfGo3G7yS9KOn/0PxUs9k8cIRrxko6r9lsfrTRaFwp6YVm\ns/kVfP5Xkn4k6X3NZvMXy9pOk/RFSX/XbDaby9qOkbSRpM9L+idJjzabzTFD7nWFpH0lvbfZbP57\nl9MNBAJdoMrfixH6+jNJtzWbzS3rGl/OPe6WdHOz2bwKbfH36U2Mty/vAQT6jrFdPJxvLPsnodls\n/rjRaDwvaYykO5Y1T5Z0p6QdJP3jsrbxkmYvs/9b0uqNRuNvms3mDyWp0Wj8iaTNhvYfCASWK7r5\ne0G8W9LoGvoZCfH3KZBB/MB58yHXa7fsbS29mfi/C15/r6Sxku5oNBqrSHqHpHMlnSDpHxuNxjsl\nbSJpmqSVtPSN8EZJe0n6+2V97CzpdklHV5hTIBDoDdr9vZgu6UBJ75T0HkmnN5vNi5Z9dqykfST9\nVtK3Je0n6QpJf9RoNJZoqadkU0lnSvpjSf8jaVaz2by/0WjsJ2n/Ze2/aDab4xuNxv6SDpH0Vkk/\nk3R4s9n8VqPR+ICkqyT9tZZ6afL+Xknx9+lNi7cu7wEE+o6HG43GM/in3R+FMvAfEGnp29Hdkr4h\naZ1Go/EXkj4u6eVms/lvuOYaLf2DYuwj6coaxhIIBOrDsL8XjUZjJUkHSJrUbDZHSZqqpT9W1Gg0\ndtBSGufjzWbzo1pK9xympT9yfr3s+++WdLOkI5vN5nrLvn/tsh8fkrSWpDHLftyM0dK/DZsvu/Yf\nJN267Htfk7Sw2WyuI+lQSWu0mUP8fXqTIjw4bz7U5XImFkv6UKPReLeW/gE5rdls/rbRaMzXUtfv\nmlr6RyWh2WwuaTQav2s0GqMk/VTSu5rN5kuNRqPmoQUCgS6Q+/ei0WhsL2lyo9FYTdL6kv5k2UcT\nJN3UbDb/Q5KazebRy76/Ci7/mKTvNJvNp5Z95+VGo/G4lv4IeUPS881m81fLvrudpNUkLcTfhncv\n+1szXtJnl/XxT41G44E2c4i/T29ShAcnQLxFkpa5bAuj2Wz+n6T5kraVtJ6kR5d9dI+kzSVtucwe\nCr8lTZN0dbUhBwKBfqLRaKws6TlJH9LSZ32WWlTW/w757p82Go2/GdJF3v933qbWC/evhnz3mmaz\nuUGz2dxA0igt9bj8Qkt/DLGv3+aNN/4+vXkRP3ACxk/VCgLcuc13Rsq6u1dLMxAeXvYHRZLmaukb\n0srNZvOZnGuulfRJSbtLuq70iAOBwPLARpL+tdlsntpsNh/QUq+IGo3GWyU9KGnnRqPxrmXfPUlL\nvSz/q6U/YqSlHpU1Go3G6GXXra2lPzQWaPjfmHmS9liWDSVJMyTNazabb0i6T0vjgPyja/wIY46/\nT29CxA+cNxdGygA4UtLXGo3G01rqcv7nnOuGZSkA90v6qODqbTab/yrpPyU9lDeOZrP5z5JeXmou\nTeHsMMZAINA/jPSsv9ZoNL7VaDQelfQbSf8iadVms3mvlgYUP74se+kvJR237PMljUbjZUm/k7Sb\npPOWfWe2pP2azeZ3NORvTLPZnCfpDEkPNBqN57TUm7LTso8Pk7TWsj4v11KvUjvE36dAIBAIBAKB\nQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFA\nIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAg\nEAgEAoFAIBAIBAKBQCAQCAQCKwje0uHzN4Y1vNFqestb3tKxPbfTCt/t9L1+oMy4e3Vfotdj6LTX\n7e5f5zqVGUPV+5aZTyfUuSed5tOP85g395L3KvTlWbNmpRu94x3vkCT9yZ/8Sfr8n//5n5P9nve8\nJ9m//vWvJUnvfOc7U9sf/uEfJvs//uM/kv3Hf/zHkqT3ve99qe3nP/95st/+9rdLkr73ve+lttGj\nRyf7xz/+cbJ/9atfSZL++q//OrX993//d26/Htu//uu/praVV1452W9961uTvdpqq0mS/vM//3PY\nvSTp3//93yVJ/+///b/U9ud//ufJ/t///d9ke/24X7zXT3/602R7Hf/iL/5i2Lgl6X/+53+G9bXS\nSisl+xe/+EWyfWY4lj/6oz9KNtfp//7v/4b1633iuHz/od/lXv7Xf/2XpOza/eVf/mWy/+3f/m3Y\nd7ke/O6f/umfJvs73/mOpNa5HPq5zxv3ifPlOv/BH/yBpOz+8bvvfe97k+114Hx49l9//XVJ0i9/\n+cvUxueVY/Q6so179md/9mfJ9trw+eNec//e9ra3SZJ+97vfDWvj2H/zm9+kNs6de/03f/M3w67n\nc88z4HX0WCXpK1/5yrC/NW8d2hAIBAKBQCDw+463j/Rh3htiu7e3Mm91Zd5Gy3iDuh1XJywvL1Id\n963idenkHam6Z+3u2+132423yrg6XddpLGW8blW9n53a6zg3VeZe5b70HHziE5+QJH3jG99IbR/4\nwAeSvWjRomRvvfXWkqRXXnkltdE78rd/+7fJvuWWWyRJY8aMSW0/+9nPkv3cc89JkrbffvvU5rd3\nSfrJT36S7J133lmS9Pjjj6e2uXPnJnvq1KnJ9pv/2LFjh91Lkm644YZk77rrrpKy3pPvfve7ybaH\np9FopDZ6nLhm22yzjaSWl2QoOLfJkydLktZbb73Utnjx4mT/6Ec/kpT1NixYsCDZ++23X7LtUXrq\nqadS27vf/e5kT5kyJdkLFy6UlPVC0BPyyCOPSJL22muv1MY1//73v5/sadOmSZLmzZuX2ujB4xmy\n92LTTTdNbRtssEGy7Sljf7wXPSn2btAbQY8Gz/Yaa6whqTVvSXr/+9+fbHoEn3/+eUnSLrvsktp4\nVjbccENJWY8HzzPPkL2T9CzyOeUzcckll0iSdtxxx9RGT8r666+f7FGjRkmSvvWtb6W222+/Pdmb\nbLKJpKynzPOSst6pZ599dth3ue9cX3sH7cVqh/DgBAKBQCAQGDiM6MGp+rZZZ3zESP0PRZ5noWq/\nK0LMTyeUiU+q8ibe6foi9+00xl7FlpSZb5UxdBpXmXieTp6nIt/Na68jLi5v/3rxXD/55JPJ9tvz\n+PHjUxvfCsnn+42Vngd6bXidPUP0QjB+xW+x9BDR68LYgbzYn7/6q79KNuMUXnvttcy/pexb++qr\nr55sx2DQW8Qx2jPANr71jxs3Ltn2XjB2hPeld8MeGu7nddddl+zp06dLyr6p0ytDb43fyunFIH74\nwx8m2+v08ssvpzbGoey2226SpBdffDG1MY6E7Z4DvWP77rtvsh966KFhY2Rc1D333JNsegvcL70N\n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\n", | |
"text": [ | |
"<matplotlib.figure.Figure at 0x7f2c9dbbc610>" | |
] | |
} | |
], | |
"prompt_number": 9 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 9 | |
} | |
], | |
"metadata": {} | |
} | |
] | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import collections | |
import numpy as np | |
Population = collections.namedtuple('Population', 'n_neurons t_rc t_ref gains biases') | |
SimStep = collections.namedtuple('SimStep', 'voltage refs spikes') | |
def generate_population(n_neurons, t_rc, t_ref, max_rate): | |
"""Generate a population for simulation using the given parameters.""" | |
# Generate the max_rates for the population, and the intercepts (in range | |
# +/- 1) | |
max_rates = np.random.uniform(0, max_rate, size=n_neurons) | |
intercepts = np.linspace(-1., 1., n_neurons, endpoint=False) | |
z = 1. / (1 - np.exp((t_ref - 1./max_rates)/t_rc)) | |
gains = (1. - z)/(intercepts - 1.) | |
biases = 1. - gains*intercepts | |
# Generate and return the population | |
return Population(n_neurons, t_rc, t_ref, gains, biases) | |
def simulate_population_step(population, in_currents, pstep, dt): | |
"""Simulate a population of neurons given the input current and the | |
previous simulation step. | |
""" | |
# Add the biases to the input currents | |
in_currents += population.biases | |
# Calculate dV and the subsequent voltage | |
dv = (in_currents - pstep.voltage)*dt / population.t_rc | |
dv[pstep.refs < 0] = 0 | |
voltage = pstep.voltage + dv | |
voltage[voltage < 0] = 0. | |
# Decrease refractory periods | |
refs = pstep.refs | |
refs[refs > 0.] -= 1 | |
# Deal with spikes | |
spikes = voltage > 1. | |
voltage[spikes] = 0. | |
pets = np.random.rand(population.n_neurons) < (voltage - 1.)/dv | |
refs[spikes] = int((population.t_ref) / dt) | |
refs[np.all(np.vstack([spikes, pets]), axis=0)] -= 1 | |
# Return the simulation step | |
return SimStep(voltage, refs, spikes) | |
def simulate_feedforward(population, inputs, weight_matrix, dt=0.001, | |
filter_tc=0.005): | |
"""Simulate a feedforward connection from the spiking inputs to the | |
population of neurons. | |
`inputs` is expected to be a m-by-t matrix of input values. | |
""" | |
assert weight_matrix.shape == (inputs.shape[0], population.n_neurons) | |
spike_times = [list([-1.]) for n in range(population.n_neurons)] | |
# Create a series of filter holder values | |
synaptic_filters = np.zeros(population.n_neurons) | |
f_m1 = np.exp(-dt/filter_tc) | |
f_m2 = 1. - f_m1 | |
# For each simulation step (i.e., each column of the input) apply the input | |
# to the population. | |
pstep = SimStep(np.zeros(population.n_neurons), | |
np.zeros(population.n_neurons), []) | |
for t, inp in enumerate(inputs.T): | |
# Apply any spikes to the synapses to get the current contributions for | |
# this simulation step. | |
ins = inp.dot(weight_matrix) | |
synaptic_filters *= f_m2 | |
synaptic_filters += f_m1 * ins | |
# Simulate the neurons for this step | |
pstep = simulate_population_step( | |
population, np.copy(synaptic_filters), pstep, dt) | |
# Save the spike times | |
for n in np.where(pstep.spikes)[0]: | |
spike_times[n].append(t * dt) | |
# Return the spike times | |
return spike_times | |
def get_interspike_times(spike_times): | |
"""Get a list of interspike times for each neuron.""" | |
interspike_times = list() | |
for spikes in spike_times: | |
interspike_times.append( | |
[spikes[n] - spikes[n-1] for n in range(1, len(spikes))] | |
) | |
return interspike_times |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment