- nest 安装与介绍
NEST(神经模拟工具)最初是在 1990 年代后期开发的。它的主要目标是作为计算神经科学模拟器。它支持具有不同生物学细节水平的各种神经元和突触模型。例如,NEST 的神经元模型范围从泄漏积分和激发模型到详细的 Hodgkin-Huxley 模型。 NEST 是用 C++ 编写的,但有一个称为 PyNEST 的 Python 接口。该模拟器支持多线程混合并行化和 MPI 多节点模拟。它可以灵活地从单核笔记本电脑扩展到多节点超级计算机 。NEST 实现离散事件模拟;因此,NEST 的性能很大程度上取决于网络中的活动量。
nest的安装现在主要有2.x和3.x,安装的步骤可以在官网上直接找到
Install NEST — NEST Simulator Documentation
这里我建议安装3.x,python版本不能带太低,建议3.8.10以后的
详细的介绍我就不说了,具体的可以自己百度,主要开始敲代码
- 创建神经元并显示电压变化曲线
import matplotlib.pyplot as plt
import nest
import nest.voltage_trace
nest.ResetKernel()
#设置仿真精度
nest.resolution = 0.001
#创建了一个HH的神经元
neuron = nest.Create("hh_psc_alpha")
#用来测量神经元的膜电位的变化情况
voltmeter = nest.Create("voltmeter")
#给HH神经元进行一个恒定的电流注入
neuron.I_e = 376.0
#将检测器和神经元进行链接
nest.Connect(voltmeter, neuron)
#开始仿真
nest.Simulate(10.0)
#可以直接调用nest提供的api函数访问电压的变化
#nest.voltage_trace.from_device(voltmeter)
#但是有时候需要自定义电压低变化曲线
# 第一种方式,通过GetStatus获取检测起的状态,返回一个tupple
# 然后通过字典访问相应的数据
# events = nest.GetStatus(voltmeter, 'events')
# V_m = events[0]['V_m']
# times = events[0]['times']
#第二种方式是直接通过检测器提供的get函数获取
V_m = voltmeter.get('events','V_m')
times = voltmeter.get('events','times')
plt.plot(times,V_m,label="Membrane potential")
plt.axhline(y = 20,color='r',linestyle='--',label='Threshold Voltage')
plt.xlabel("Time (%s)")
plt.ylabel("Membrane potential (mV)")
plt.title("Action Potential")
plt.legend()
plt.show()
运行结果如下:
- 经典神经元的电压变化曲线
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import nest
import nest.voltage_trace
nest.ResetKernel()
nest.resolution = 0.001
#创建神经元
hh = nest.Create("hh_psc_alpha")
lif = nest.Create("iaf_cond_alpha")
izhi = nest.Create("izhikevich")
#创建检测器
voltmeter = nest.Create("voltmeter",3)
hh.I_e = 376.0
lif.I_e = 376.0
izhi.I_e = 376.0
nest.Connect(voltmeter[0], hh)
nest.Connect(voltmeter[1], lif)
nest.Connect(voltmeter[2], izhi)
nest.Simulate(40.0)
#显示多个窗口
fig, axes = plt.subplots(1,3,figsize=(12,4))
#HH
hh_events = nest.GetStatus(voltmeter[0], 'events')
axes[0].plot(hh_events[0]['times'],hh_events[0]['V_m'],label="Membrane potential")
axes[0].set_title("HH")
#LIF
lif_events = nest.GetStatus(voltmeter[1], 'events')
axes[1].plot(lif_events[0]['times'],lif_events[0]['V_m'],label="Membrane potential")
axes[1].set_title("LIF")
#Izhikevich
izhi_events = nest.GetStatus(voltmeter[2], 'events')
axes[2].plot(izhi_events[0]['times'],izhi_events[0]['V_m'],label="Membrane potential")
axes[2].set_title("Izhikevich")
#设置间隙
plt.tight_layout()
plt.show()
运行结果: