首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟模型神经元

模拟模型神经元
EN

Code Golf用户
提问于 2018-02-08 01:10:42
回答 4查看 1.2K关注 0票数 15

Izhikevich神经元是一种简单而有效的生物神经元模型,用于离散时间步进模拟。在这个高尔夫挑战中,你将实现这个模式。

参数

该模型只涉及7个变量组织成2个微分方程,相比之下,几十个参数的生理精确模型。

  • vu是神经元的两个状态变量。在这里,v是表示细胞电位随时间变化的“快速”变量,而u是表示某些膜特性的“慢”变量。v变量是最重要的变量,因为这是仿真的输出。
  • abcd是描述神经元性质的固定常数。不同类型的神经元有不同的常数,这取决于所期望的行为。值得注意的是,c是复位电位,这是细胞膜电位后,细胞返回到尖峰。
  • I表示神经元的输入电流。在网络模拟中,这将随着时间的推移而改变,但为了我们的目的,我们将I视为一个固定常数。

模型

该模型具有非常简单的伪码。首先,我们获取abcd的常量值,并使用它们初始化vu

代码语言:javascript
复制
v = c
u = b * c

接下来,我们按需要循环多次地遍历仿真代码。每次迭代代表1毫秒的时间。

代码语言:javascript
复制
for 1..t:
  if v >= 30:    # reset after a spike
    v = c
    u = u + d
  v += 0.04*v^2 + 5*v + 140 - u + I
  u += a * (b*v - u)
  print v

某些现实世界的实现包括额外的步骤,以提高数值的准确性,但我们这里不包括这些步骤。

输入

作为输入,您的程序/函数应该采用abcdIt (模拟时间步骤的数量)的值。一旦设置,这些参数都不会在我们简单的模拟过程中改变。输入的顺序无关紧要:您可以指定程序接受这些参数的顺序。

输出

输出将是在模拟过程中表示细胞膜电位(由变量v给出)的数字列表。列表可以是任何适当的格式。

您可以选择是否在输出中包含模拟的第0值(任何时间之前的初始配置)。例如,对于0.02 0.2 -50 2 10 6的输入(对于a b c d I t),输出的

代码语言:javascript
复制
-50
-40
-16.04
73.876224
-42.667044096
-25.8262335380956
29.0355029192068

代码语言:javascript
复制
-40
-16.04
73.876224
-42.667044096
-25.8262335380956
29.0355029192068

是可以接受的。

您的值不必与上面的值完全相同,这取决于您的语言处理浮动的方式。

参考实现

下面是我用Perl编写的演示模型的TIO实现。这些参数是上述论文中的“抖振”神经元的参数,这说明了这个模型如何能够重现神经元的一些更复杂的特性,例如在高和低活动状态之间的交替。如果您查看输出,您可以看到神经元在哪里立即上升了几次,但随后等待了一段时间,然后再上升几次(尽管单元输入电压I始终是恒定的)。

EN

回答 4

Code Golf用户

发布于 2018-02-08 06:13:53

Python 2,100字节

代码语言:javascript
复制
a,b,c,d,I,t=input();v=c;u=b*c
exec"if v>=30:v=c;u+=d\nv=v*v/25+6*v+140-u+I;u+=a*(b*v-u);print v\n"*t

在网上试试!

由于user71546,保存了2个字节。

票数 3
EN

Code Golf用户

发布于 2018-02-08 04:56:19

红宝石,94字节

代码语言:javascript
复制
->a,b,c,d,i,t{v=c
u=b*c
t.times{v>=30?(v=c;u+=d):0
v+=0.04*v**2+5*v+140-u+i
u+=a*(b*v-u)
p v}}

在网上试试!

引用实现的另一个简单的端口,一个接受6个参数的lambda。

票数 2
EN

Code Golf用户

发布于 2018-02-09 06:15:41

元素,81字节

代码语言:javascript
复制
_a;_b;_3:b~*u;_d;_I;_'[3:\.04*5+*140+u~-+I~++4:\
.`30<!b~*u~-+a~*u~+[d~+]u;[#2:]]

在网上试试!Esolangs页面

解释:

代码语言:javascript
复制
_a;_b;_3:b~*u;_d;_I;_'[ ... ]

程序的这一部分需要输入。它将常量abdI存储到变量中。c的输入从不存储在变量中,而是在整个执行过程中保持在主堆栈上。复制了三个副本:一个在顶部用于初始化u,一个在中间作为初始v,另一个在底部作为常量ct的输入将立即抛到控制堆栈上,作为围绕程序其余部分的for循环( [...])的基础。

代码语言:javascript
复制
3:\.04*5+*140+u~-+I~++4:

程序的这一部分获取v的当前值并计算新值,然后生成四份新的v值。

代码语言:javascript
复制
\
.`

v的第一份副本附加了一个新行并打印出来。

代码语言:javascript
复制
30<!

v的第二份拷贝用于测试神经元是否有尖峰。此测试的结果将放在控制堆栈上,供以后使用。

代码语言:javascript
复制
b~*u~-+a~*u~+

这一部分计算“增量u",意思是要添加到u中的金额。

代码语言:javascript
复制
[d~+]

如果神经元处于尖峰状态,则此IF块将d添加到上述和中。这将通常是两个任务合并成一个单独的任务。

代码语言:javascript
复制
u;

这将存储u的更新值。

代码语言:javascript
复制
[#2:]

此IF块是上述IF块的延续。如果神经元处于尖峰状态,请删除v的当前值(该值现在位于主堆栈的顶部),并将其替换为c的副本(该副本一直位于主堆栈的底部)。

这基本上就是全部了。一个次要的注意是,这个东西漏出了内存:在每个循环迭代之后,需要一个额外的"#来删除控制堆栈的顶部(评估的IF条件)。

虽然我不认为元素是最优雅的高尔夫语言,但这个挑战确实让我展示了一个有趣的特性:由于主堆栈和控制堆栈之间的分隔,我可以使用一个IF语句,将条件和身体分割成多个部分,并与无条件代码交织在一起。

票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/155195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档