实施Izhikevich神经元模型

时间:2017-01-19 23:15:48

标签: r neural-network biological-neural-network

我正在尝试实施Izhikevich模型的尖峰神经元。这种神经元的公式非常简单:

  

v [n + 1] = 0.04 * v [n] ^ 2 + 5 * v [n] + 140 - u [n] + I

     

u [n + 1] = a *(b * v [n] - u [n])

其中v是膜电位,u是恢复变量。

如果 v 超过30,则重置为 c u 重置为 u + d

鉴于这样一个简单的等式,我不会指望任何问题。但是,虽然图表应该看起来像what it should look like,但我得到的只是:what it looks like

我完全不知道我做错了什么,因为没有什么可错的。我已经寻找其他实现,但我正在寻找的代码总是隐藏在某个地方的DLL中。但是我很确定我正在完成作者(2)的Matlab代码正在做的事情。这是我的完整R代码:

v = -70
u = 0
a = 0.02
b = 0.2
c = -65
d = 6
history <- c()

for (i in 1:100) {
  if (v >= 30) {
    v = c
    u = u + d
  }
  v = 0.04*v^2 + 5*v + 140 - u + 0
  u=a*(b*v-u); 
  history <- c(history, v)
}

plot(history, type = "l")

对于曾经实施Izhikevich模型的人,我缺少什么?

有用的链接: (1)http://www.opensourcebrain.org/projects/izhikevichmodel/wiki (2)http://www.izhikevich.org/publications/spikes.pdf

答案

所以事实证明我读错了公式。显然v'意味着新的v = v + 0.04 * v ^ 2 + 5 * v + 140 - u + I.我的老师会把它写成v'= 0.04 * v ^ 2 + 6 * v + 140 - u + I.我非常感谢你帮我指出这一点。

1 个答案:

答案 0 :(得分:1)

看看下面R中实现Izhikevich模型的代码。它产生以下R图:

常规尖峰细胞

Izhikevich Regular Spiking RS Cell Plot

抖动小区Izhikevich Chattering CH Cell Plot

和R代码:

# Simulation parameters
dt = 0.01 # ms
simtime = 500 # ms
t = 0

# Injection current
I = 15
delay = 100 # ms

# Model parameters (RS)
a = 0.02
b = 0.2
c = -65
d = 8

# Params for chattering cell (CH)
# c = -50
# d = 2

# Initial conditions
v = -80 # mv
u = 0

# Input current equation
current = function()
{
  if(t >= delay)
  {
    return(I)
  }

  return (0)
}

# Model state equations
deltaV = function()
{
  return (0.04*v*v+5*v+140-u+current())
}

deltaU = function()
{
  return (a*(b*v-u))
}

updateState = function()
{
  v <<- v + deltaV()*dt
  u <<- u + deltaU()*dt

  if(v >= 30) 
  {
    v <<- c
    u <<- u + d
  }
}

# Simulation code
runsim = function()
{
  steps = simtime / dt
  resultT = rep(NA, steps)
  resultV = rep(NA, steps)

  for (i in seq(steps))
  {
    updateState()
    t <<- dt*(i-1)

    resultT[i] = t
    resultV[i] = v
  }

  plot(resultT, resultV, 
       type="l", xlab = "Time (ms)", ylab = "Membrane Potential (mV)")
}

runsim()

一些注意事项:

  • 我已经选择了&#34; Regular Spiking(RS)&#34;来自Izhikevich's site的单元格。您可以从该页面上的两个右上角图中选择其他参数。取消注释CH参数以获得&#34; Chattering&#34;类型细胞。
  • 正如评论者所建议的那样,问题中的前两个方程是错误实现的微分方程。实现第一个的正确方法是:&#34; v [n + 1] = v [n] +(0.04 * v [n] ^ 2 + 5 * v [n] + 140 - u [ n] + I)* dt&#34;。例如,请参阅上面的代码。 dt是指用户指定的时间步长积分变量,通常是dt&lt;&lt; 1毫秒。
  • 在问题的for循环中,应首先更新状态变量u和v,然后检查条件。
  • 如其他人所述,这两种细胞类型都需要电流源。我从this page on the author's site使用了15(我相信这些是微微放大器)(屏幕截图中我的底部值)。我还实现了当前开始的延迟(100 ms参数)。
  • 模拟代码应该实现某种时间跟踪,以便更容易知道何时在结果图中出现尖峰。上面的代码实现了这一点,并运行模拟500毫秒。