In [1]:
from sympy import *
init_printing()
from IPython.display import display

%matplotlib inline

import matplotlib.pyplot as plt

Equation for Neuron Paper

  A dendritic segment can robustly classify a pattern by subsampling a small number of cells from a larger population.  Assuming a random distribution of patterns, the exact probability of a false match is given by the following equation:

In [2]:
oxp = Symbol("Omega_x'")
b = Symbol("b")
n = Symbol("n")
theta = Symbol("theta")
s = Symbol("s")
a = Symbol("a")

subsampledOmega = (binomial(s, b) * binomial(n - s, a - b)) / binomial(n, a)
subsampledFpF = Sum(subsampledOmega, (b, theta, s))
subsampledOmegaSlow = (binomial(s, b) * binomial(n - s, a - b)) 
subsampledFpFSlow = Sum(subsampledOmegaSlow, (b, theta, s))/ binomial(n, a)

display(subsampledFpF)
display(subsampledFpFSlow)


Sum(binomial(s, b)*binomial(n - s, a - b)/binomial(n, a), (b, theta, s))
Sum(binomial(s, b)*binomial(n - s, a - b), (b, theta, s))/binomial(n, a)

where n refers to the size of the population of cells, a is the number of active cells at any instance in time, s is the number of actual synapses on a dendritic segment, and θ is the threshold for NMDA spikes. Following (Ahmad & Hawkins, 2015), the numerator counts the number of possible ways θ or more cells can match a fixed set of s synapses. The denominator counts the number of ways a cells out of n can be active.

Example usage


In [3]:
display("n=10000, a=64, s=24, theta=12", subsampledFpF.subs(s,24).subs(n, 10000).subs(a, 64).subs(theta, 12).evalf())


'n=10000, a=64, s=24, theta=12'
0

In [4]:
display("n=10000, a=300, s=24, theta=12", subsampledFpFSlow.subs(theta, 12).subs(s, 24).subs(n, 10000).subs(a, 300).evalf())


'n=10000, a=300, s=24, theta=12'
8.37584522709849e-13

In [5]:
display("n=2048, a=400, s=40, theta=20", subsampledFpF.subs(theta, 15).subs(s, 30).subs(n, 10000).subs(a, 300).evalf())


'n=2048, a=400, s=40, theta=20'
1.04849765783378e-15

Table 1B


In [6]:
T1B = subsampledFpFSlow.subs(n, 100000).subs(a, 2000).subs(theta,s).evalf()
print "n=100000, a=2000, theta=s"
display("s=6",T1B.subs(s,6).evalf())
display("s=8",T1B.subs(s,8).evalf())
display("s=10",T1B.subs(s,10).evalf())


n=100000, a=2000, theta=s
's=6'
6.35308872941916e-11
's=8'
2.52507239284961e-14
's=10'
1.00163216178113e-17

Table 1C


In [7]:
T1C = subsampledFpFSlow.subs(n, 100000).subs(a, 2000).subs(s,2*theta).evalf()
print "n=10000, a=300, s=2*theta"
display("theta=6",T1C.subs(theta,6).evalf())
display("theta=8",T1C.subs(theta,8).evalf())
display("theta=10",T1C.subs(theta,10).evalf())
display("theta=12",T1C.subs(theta,12).evalf())


n=10000, a=300, s=2*theta
'theta=6'
5.29386836275369e-8
'theta=8'
2.81724528327272e-10
'theta=10'
1.54192767258720e-12
'theta=12'
8.58694100276592e-15

Table 1D


In [8]:
m = Symbol("m")
T1D = subsampledFpF.subs(n, 100000).subs(a, 2000).subs(s,2*m*theta).evalf()
print "n=100000, a=2000, s=2*m*theta"
display("theta=10, m=2",T1D.subs(theta,10).subs(m,2).evalf())
display("theta=10, m=4",T1D.subs(theta,10).subs(m,4).evalf())
display("theta=10, m=6",T1D.subs(theta,10).subs(m,6).evalf())
display("theta=20, m=6",T1D.subs(theta,20).subs(m,6).evalf())


n=100000, a=2000, s=2*m*theta
'theta=10, m=2'
4.91541864813209e-9
'theta=10, m=4'
4.62568448037595e-6
'theta=10, m=6'
0.000158799793094937
'theta=20, m=6'
1.07990763941591e-7

Charts for SDR Paper

  The following sections calculates the numbers for some of the SDR paper charts.


Importance of large n


In [9]:
eq1 = subsampledFpFSlow.subs(s, 64).subs(theta, 12)
print "a=64 cells active, s=16 synapses on segment, dendritic threshold is theta=8\n"
errorList = []
nList = []
for n0 in range(300,20100,200):
    error = eq1.subs(n, n0).subs(a,64).evalf()
    errorList += [error]
    nList += [n0]
    print "population n = %5d, sparsity = %5.2f%%, probability of false match = "%(n0, 64/n0), error
    
print errorList
print nList


a=64 cells active, s=16 synapses on segment, dendritic threshold is theta=8

population n =   300, sparsity =  0.00%, probability of false match =  0.767798046805888
population n =   500, sparsity =  0.00%, probability of false match =  0.0960845416487165
population n =   700, sparsity =  0.00%, probability of false match =  0.00881793984023789
population n =   900, sparsity =  0.00%, probability of false match =  0.00104201059477680
population n =  1100, sparsity =  0.00%, probability of false match =  0.000161866998734267
population n =  1300, sparsity =  0.00%, probability of false match =  3.16121753895779e-5
population n =  1500, sparsity =  0.00%, probability of false match =  7.42838135168482e-6
population n =  1700, sparsity =  0.00%, probability of false match =  2.02810556367455e-6
population n =  1900, sparsity =  0.00%, probability of false match =  6.26296994067198e-7
population n =  2100, sparsity =  0.00%, probability of false match =  2.14288245865589e-7
population n =  2300, sparsity =  0.00%, probability of false match =  7.99418222318950e-8
population n =  2500, sparsity =  0.00%, probability of false match =  3.21077808048928e-8
population n =  2700, sparsity =  0.00%, probability of false match =  1.37438883181648e-8
population n =  2900, sparsity =  0.00%, probability of false match =  6.21879891409450e-9
population n =  3100, sparsity =  0.00%, probability of false match =  2.95443192395266e-9
population n =  3300, sparsity =  0.00%, probability of false match =  1.46548703909345e-9
population n =  3500, sparsity =  0.00%, probability of false match =  7.55426623928377e-10
population n =  3700, sparsity =  0.00%, probability of false match =  4.03069042524778e-10
population n =  3900, sparsity =  0.00%, probability of false match =  2.21855613504858e-10
population n =  4100, sparsity =  0.00%, probability of false match =  1.25602427254846e-10
population n =  4300, sparsity =  0.00%, probability of false match =  7.29565898352752e-11
population n =  4500, sparsity =  0.00%, probability of false match =  4.33823270726987e-11
population n =  4700, sparsity =  0.00%, probability of false match =  2.63574676030204e-11
population n =  4900, sparsity =  0.00%, probability of false match =  1.63341677848632e-11
population n =  5100, sparsity =  0.00%, probability of false match =  1.03094878512466e-11
population n =  5300, sparsity =  0.00%, probability of false match =  6.61820425636368e-12
population n =  5500, sparsity =  0.00%, probability of false match =  4.31602894863397e-12
population n =  5700, sparsity =  0.00%, probability of false match =  2.85628272660169e-12
population n =  5900, sparsity =  0.00%, probability of false match =  1.91632278470408e-12
population n =  6100, sparsity =  0.00%, probability of false match =  1.30228251757813e-12
population n =  6300, sparsity =  0.00%, probability of false match =  8.95704526501288e-13
population n =  6500, sparsity =  0.00%, probability of false match =  6.23063767783764e-13
population n =  6700, sparsity =  0.00%, probability of false match =  4.38047430918503e-13
population n =  6900, sparsity =  0.00%, probability of false match =  3.11076993767398e-13
population n =  7100, sparsity =  0.00%, probability of false match =  2.23013796374613e-13
population n =  7300, sparsity =  0.00%, probability of false match =  1.61321052161476e-13
population n =  7500, sparsity =  0.00%, probability of false match =  1.17690561046501e-13
population n =  7700, sparsity =  0.00%, probability of false match =  8.65555486648568e-14
population n =  7900, sparsity =  0.00%, probability of false match =  6.41470046810705e-14
population n =  8100, sparsity =  0.00%, probability of false match =  4.78877290083649e-14
population n =  8300, sparsity =  0.00%, probability of false match =  3.59988148092467e-14
population n =  8500, sparsity =  0.00%, probability of false match =  2.72413367559495e-14
population n =  8700, sparsity =  0.00%, probability of false match =  2.07450519186865e-14
population n =  8900, sparsity =  0.00%, probability of false match =  1.58936937437398e-14
population n =  9100, sparsity =  0.00%, probability of false match =  1.22474470259293e-14
population n =  9300, sparsity =  0.00%, probability of false match =  9.49008634350598e-15
population n =  9500, sparsity =  0.00%, probability of false match =  7.39262555848706e-15
population n =  9700, sparsity =  0.00%, probability of false match =  5.78811819582042e-15
population n =  9900, sparsity =  0.00%, probability of false match =  4.55405220189980e-15
population n = 10100, sparsity =  0.00%, probability of false match =  3.59995870603115e-15
population n = 10300, sparsity =  0.00%, probability of false match =  2.85862824712372e-15
population n = 10500, sparsity =  0.00%, probability of false match =  2.27984148947650e-15
population n = 10700, sparsity =  0.00%, probability of false match =  1.82586511021711e-15
population n = 10900, sparsity =  0.00%, probability of false match =  1.46819534023413e-15
population n = 11100, sparsity =  0.00%, probability of false match =  1.18518918830356e-15
population n = 11300, sparsity =  0.00%, probability of false match =  9.60331248430696e-16
population n = 11500, sparsity =  0.00%, probability of false match =  7.80958371258306e-16
population n = 11700, sparsity =  0.00%, probability of false match =  6.37316119269338e-16
population n = 11900, sparsity =  0.00%, probability of false match =  5.21857011831390e-16
population n = 12100, sparsity =  0.00%, probability of false match =  4.28715944127415e-16
population n = 12300, sparsity =  0.00%, probability of false match =  3.53316120669355e-16
population n = 12500, sparsity =  0.00%, probability of false match =  2.92071624826489e-16
population n = 12700, sparsity =  0.00%, probability of false match =  2.42161894566693e-16
population n = 12900, sparsity =  0.00%, probability of false match =  2.01359959726941e-16
population n = 13100, sparsity =  0.00%, probability of false match =  1.67901061328122e-16
population n = 13300, sparsity =  0.00%, probability of false match =  1.40381739546325e-16
population n = 13500, sparsity =  0.00%, probability of false match =  1.17682010751169e-16
population n = 13700, sparsity =  0.00%, probability of false match =  9.89051152843804e-17
population n = 13900, sparsity =  0.00%, probability of false match =  8.33306913245833e-17
population n = 14100, sparsity =  0.00%, probability of false match =  7.03782486292717e-17
population n = 14300, sparsity =  0.00%, probability of false match =  5.95785743686907e-17
population n = 14500, sparsity =  0.00%, probability of false match =  5.05512704847369e-17
population n = 14700, sparsity =  0.00%, probability of false match =  4.29870479976394e-17
population n = 14900, sparsity =  0.00%, probability of false match =  3.66337249063553e-17
population n = 15100, sparsity =  0.00%, probability of false match =  3.12851175067647e-17
population n = 15300, sparsity =  0.00%, probability of false match =  2.67721997530410e-17
population n = 15500, sparsity =  0.00%, probability of false match =  2.29560462498643e-17
population n = 15700, sparsity =  0.00%, probability of false match =  1.97221823764714e-17
population n = 15900, sparsity =  0.00%, probability of false match =  1.69760479483278e-17
population n = 16100, sparsity =  0.00%, probability of false match =  1.46393447333667e-17
population n = 16300, sparsity =  0.00%, probability of false match =  1.26470875739574e-17
population n = 16500, sparsity =  0.00%, probability of false match =  1.09452172272728e-17
population n = 16700, sparsity =  0.00%, probability of false match =  9.48866290051899e-18
population n = 16900, sparsity =  0.00%, probability of false match =  8.23976577817741e-18
population n = 17100, sparsity =  0.00%, probability of false match =  7.16699310476475e-18
population n = 17300, sparsity =  0.00%, probability of false match =  6.24388673637030e-18
population n = 17500, sparsity =  0.00%, probability of false match =  5.44820137970605e-18
population n = 17700, sparsity =  0.00%, probability of false match =  4.76119666953519e-18
population n = 17900, sparsity =  0.00%, probability of false match =  4.16705431178299e-18
population n = 18100, sparsity =  0.00%, probability of false match =  3.65239714098025e-18
population n = 18300, sparsity =  0.00%, probability of false match =  3.20589141787563e-18
population n = 18500, sparsity =  0.00%, probability of false match =  2.81791726811520e-18
population n = 18700, sparsity =  0.00%, probability of false match =  2.48029502476245e-18
population n = 18900, sparsity =  0.00%, probability of false match =  2.18605753401716e-18
population n = 19100, sparsity =  0.00%, probability of false match =  1.92926033086935e-18
population n = 19300, sparsity =  0.00%, probability of false match =  1.70482308095028e-18
population n = 19500, sparsity =  0.00%, probability of false match =  1.50839688859563e-18
population n = 19700, sparsity =  0.00%, probability of false match =  1.33625304613249e-18
population n = 19900, sparsity =  0.00%, probability of false match =  1.18518959085345e-18
[0.767798046805888, 0.0960845416487165, 0.00881793984023789, 0.00104201059477680, 0.000161866998734267, 3.16121753895779e-5, 7.42838135168482e-6, 2.02810556367455e-6, 6.26296994067198e-7, 2.14288245865589e-7, 7.99418222318950e-8, 3.21077808048928e-8, 1.37438883181648e-8, 6.21879891409450e-9, 2.95443192395266e-9, 1.46548703909345e-9, 7.55426623928377e-10, 4.03069042524778e-10, 2.21855613504858e-10, 1.25602427254846e-10, 7.29565898352752e-11, 4.33823270726987e-11, 2.63574676030204e-11, 1.63341677848632e-11, 1.03094878512466e-11, 6.61820425636368e-12, 4.31602894863397e-12, 2.85628272660169e-12, 1.91632278470408e-12, 1.30228251757813e-12, 8.95704526501288e-13, 6.23063767783764e-13, 4.38047430918503e-13, 3.11076993767398e-13, 2.23013796374613e-13, 1.61321052161476e-13, 1.17690561046501e-13, 8.65555486648568e-14, 6.41470046810705e-14, 4.78877290083649e-14, 3.59988148092467e-14, 2.72413367559495e-14, 2.07450519186865e-14, 1.58936937437398e-14, 1.22474470259293e-14, 9.49008634350598e-15, 7.39262555848706e-15, 5.78811819582042e-15, 4.55405220189980e-15, 3.59995870603115e-15, 2.85862824712372e-15, 2.27984148947650e-15, 1.82586511021711e-15, 1.46819534023413e-15, 1.18518918830356e-15, 9.60331248430696e-16, 7.80958371258306e-16, 6.37316119269338e-16, 5.21857011831390e-16, 4.28715944127415e-16, 3.53316120669355e-16, 2.92071624826489e-16, 2.42161894566693e-16, 2.01359959726941e-16, 1.67901061328122e-16, 1.40381739546325e-16, 1.17682010751169e-16, 9.89051152843804e-17, 8.33306913245833e-17, 7.03782486292717e-17, 5.95785743686907e-17, 5.05512704847369e-17, 4.29870479976394e-17, 3.66337249063553e-17, 3.12851175067647e-17, 2.67721997530410e-17, 2.29560462498643e-17, 1.97221823764714e-17, 1.69760479483278e-17, 1.46393447333667e-17, 1.26470875739574e-17, 1.09452172272728e-17, 9.48866290051899e-18, 8.23976577817741e-18, 7.16699310476475e-18, 6.24388673637030e-18, 5.44820137970605e-18, 4.76119666953519e-18, 4.16705431178299e-18, 3.65239714098025e-18, 3.20589141787563e-18, 2.81791726811520e-18, 2.48029502476245e-18, 2.18605753401716e-18, 1.92926033086935e-18, 1.70482308095028e-18, 1.50839688859563e-18, 1.33625304613249e-18, 1.18518959085345e-18]
[300, 500, 700, 900, 1100, 1300, 1500, 1700, 1900, 2100, 2300, 2500, 2700, 2900, 3100, 3300, 3500, 3700, 3900, 4100, 4300, 4500, 4700, 4900, 5100, 5300, 5500, 5700, 5900, 6100, 6300, 6500, 6700, 6900, 7100, 7300, 7500, 7700, 7900, 8100, 8300, 8500, 8700, 8900, 9100, 9300, 9500, 9700, 9900, 10100, 10300, 10500, 10700, 10900, 11100, 11300, 11500, 11700, 11900, 12100, 12300, 12500, 12700, 12900, 13100, 13300, 13500, 13700, 13900, 14100, 14300, 14500, 14700, 14900, 15100, 15300, 15500, 15700, 15900, 16100, 16300, 16500, 16700, 16900, 17100, 17300, 17500, 17700, 17900, 18100, 18300, 18500, 18700, 18900, 19100, 19300, 19500, 19700, 19900]

Small sparsity is insufficient


In [10]:
print ("2% sparsity with n=400")
print subsampledFpFSlow.subs(s, 4).subs(a, 8).subs(theta, 2).subs(n,400).evalf()
print ("2% sparsity with n=4000")
print subsampledFpFSlow.subs(s, 4).subs(a, 400).subs(theta, 2).subs(n,4000).evalf()


2% sparsity with n=400
0.00206314616966578
2% sparsity with n=4000
0.0522148720308419

A small subsample can be very reliable (but not too small)


In [11]:
eq2 = subsampledFpFSlow.subs(n, 10000).subs(a, 300)
print "a=200 cells active out of population of n=10000 cells\n"
errorList = []
sList = []
for s0 in range(2,31,1):
    print "synapses s = %3d, theta = s/2 = %3d, probability of false match = "%(s0,s0/2), eq2.subs(s, s0).subs(theta,s0/2).evalf() 
    errorList += [eq2.subs(s, s0).subs(theta,s0/2).evalf()]
    sList += [s0]
    
print errorList
print sList


a=200 cells active out of population of n=10000 cells

synapses s =   2, theta = s/2 =   1, probability of false match =  0.0591029102910291
synapses s =   3, theta = s/2 =   1, probability of false match =  0.0873354694941389
synapses s =   4, theta = s/2 =   2, probability of false match =  0.00517101241148655
synapses s =   5, theta = s/2 =   2, probability of false match =  0.00844794620736664
synapses s =   6, theta = s/2 =   3, probability of false match =  0.000499865412306804
synapses s =   7, theta = s/2 =   3, probability of false match =  0.000855357919350205
synapses s =   8, theta = s/2 =   4, probability of false match =  5.05282906751424e-5
synapses s =   9, theta = s/2 =   4, probability of false match =  8.88044155296650e-5
synapses s =  10, theta = s/2 =   5, probability of false match =  5.23462085992797e-6
synapses s =  11, theta = s/2 =   5, probability of false match =  9.36152430040881e-6
synapses s =  12, theta = s/2 =   6, probability of false match =  5.50467708713271e-7
synapses s =  13, theta = s/2 =   6, probability of false match =  9.96590775459112e-7
synapses s =  14, theta = s/2 =   7, probability of false match =  5.84458284016591e-8
synapses s =  15, theta = s/2 =   7, probability of false match =  1.06781055245346e-7
synapses s =  16, theta = s/2 =   8, probability of false match =  6.24488987535941e-9
synapses s =  17, theta = s/2 =   8, probability of false match =  1.14900993578035e-8
synapses s =  18, theta = s/2 =   9, probability of false match =  6.70048689113995e-10
synapses s =  19, theta = s/2 =   9, probability of false match =  1.23977606153067e-9
synapses s =  20, theta = s/2 =  10, probability of false match =  7.20851539659221e-11
synapses s =  21, theta = s/2 =  10, probability of false match =  1.33990428897848e-10
synapses s =  22, theta = s/2 =  11, probability of false match =  7.76731651059463e-12
synapses s =  23, theta = s/2 =  11, probability of false match =  1.44929751014167e-11
synapses s =  24, theta = s/2 =  12, probability of false match =  8.37584522709849e-13
synapses s =  25, theta = s/2 =  12, probability of false match =  1.56790489972169e-12
synapses s =  26, theta = s/2 =  13, probability of false match =  9.03331595141546e-14
synapses s =  27, theta = s/2 =  13, probability of false match =  1.69568150423906e-13
synapses s =  28, theta = s/2 =  14, probability of false match =  9.73897092618566e-15
synapses s =  29, theta = s/2 =  14, probability of false match =  1.83255953842929e-14
synapses s =  30, theta = s/2 =  15, probability of false match =  1.04919182521237e-15
[0.0591029102910291, 0.0873354694941389, 0.00517101241148655, 0.00844794620736664, 0.000499865412306804, 0.000855357919350205, 5.05282906751424e-5, 8.88044155296650e-5, 5.23462085992797e-6, 9.36152430040881e-6, 5.50467708713271e-7, 9.96590775459112e-7, 5.84458284016591e-8, 1.06781055245346e-7, 6.24488987535941e-9, 1.14900993578035e-8, 6.70048689113995e-10, 1.23977606153067e-9, 7.20851539659221e-11, 1.33990428897848e-10, 7.76731651059463e-12, 1.44929751014167e-11, 8.37584522709849e-13, 1.56790489972169e-12, 9.03331595141546e-14, 1.69568150423906e-13, 9.73897092618566e-15, 1.83255953842929e-14, 1.04919182521237e-15]
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]

Impact of noise on false negatives


In [12]:
b = Symbol("b")
v = Symbol("v")
theta = Symbol("theta")
s = Symbol("s")
a = Symbol("a")

overlapSetNoise = (binomial(s, b) * binomial(a - s, v - b)) / binomial(a, v)
noiseFN = Sum(overlapSetNoise, (b, s-theta+1, s))

In [13]:
eqn = noiseFN.subs(s, 30).subs(a, 128)
print "a=128 cells active with segment containing s=30 synapses (n doesn't matter here)\n"
for t in range(8,20,4):
    print "theta = ",t
    errorList = []
    noiseList = []
    noisePct = 0.05
    while noisePct <= 0.85:
        noise = int(round(noisePct*128,0))
        errorList += [eqn.subs(v, noise).subs(theta,t).evalf()]
        noiseList += [noise/128.0]
        noisePct += 0.05
    print errorList
    print noiseList


a=128 cells active with segment containing s=30 synapses (n doesn't matter here)

theta =  8
[0, 0, 0, 3.11341516283240e-16, 2.23243424464799e-12, 7.90168637530306e-10, 1.20695707971664e-7, 3.45576265561118e-6, 8.08202472708491e-5, 0.000735429456875121, 0.00464043435771348, 0.0268657157114204, 0.0896352007201254, 0.263952754229579, 0.508714577385333, 0.770861966941236]
[0.046875, 0.1015625, 0.1484375, 0.203125, 0.25, 0.296875, 0.3515625, 0.3984375, 0.453125, 0.5, 0.546875, 0.6015625, 0.6484375, 0.703125, 0.75, 0.796875]
theta =  12
[0, 0, 2.48810797387309e-15, 7.92695349343630e-10, 2.16302525195240e-7, 1.09248135880715e-5, 0.000314435369055385, 0.00279559866084888, 0.0198782675563797, 0.0716985160403564, 0.190430462690358, 0.426525969583828, 0.664766152465367, 0.880922510721824, 0.970339402698393, 0.996376835285247]
[0.046875, 0.1015625, 0.1484375, 0.203125, 0.25, 0.296875, 0.3515625, 0.3984375, 0.453125, 0.5, 0.546875, 0.6015625, 0.6484375, 0.703125, 0.75, 0.796875]
theta =  16
[0, 0, 2.65549705827547e-8, 1.97277260559420e-5, 0.000590078912236923, 0.00627504390204146, 0.0434711883681422, 0.139067254386793, 0.351117043857492, 0.582501773030327, 0.788076297517739, 0.933878292787173, 0.983735005386502, 0.998319255844748, 0.999889798557155, 0.999997748076386]
[0.046875, 0.1015625, 0.1484375, 0.203125, 0.25, 0.296875, 0.3515625, 0.3984375, 0.453125, 0.5, 0.546875, 0.6015625, 0.6484375, 0.703125, 0.75, 0.796875]

Charts for BAMI


In [31]:
w0 = 32
print "a=%d cells active, s=%d synapses on segment, dendritic threshold is s/2\n" % (w0,w0)
errorList = []
nList = []
for n0 in range(50,500,50):
    w0 = n0/2
    eq1 = subsampledFpFSlow.subs(s, w0).subs(theta, w0/2)
    error = eq1.subs(n, n0).subs(a,w0).evalf()
    errorList += [error]
    nList += [n0]
    print "population n = %5d, sparsity = %7.4f%%, probability of false match = "%(n0, float(w0)/n0), error
    
print errorList
print nList


a=32 cells active, s=32 synapses on segment, dendritic threshold is s/2

population n =    50, sparsity =  0.5000%, probability of false match =  0.713930783595416
population n =   100, sparsity =  0.5000%, probability of false match =  0.579192330580665
population n =   150, sparsity =  0.5000%, probability of false match =  0.627949560779490
population n =   200, sparsity =  0.5000%, probability of false match =  0.556207787852021
population n =   250, sparsity =  0.5000%, probability of false match =  0.599827556589778
population n =   300, sparsity =  0.5000%, probability of false match =  0.545950866779313
population n =   350, sparsity =  0.5000%, probability of false match =  0.584632630831763
population n =   400, sparsity =  0.5000%, probability of false match =  0.539819496834182
population n =   450, sparsity =  0.5000%, probability of false match =  0.574768441538204
[0.713930783595416, 0.579192330580665, 0.627949560779490, 0.556207787852021, 0.599827556589778, 0.545950866779313, 0.584632630831763, 0.539819496834182, 0.574768441538204]
[50, 100, 150, 200, 250, 300, 350, 400, 450]

In [ ]:


In [ ]: