1. 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以后的

详细的介绍我就不说了,具体的可以自己百度,主要开始敲代码

  1. 创建神经元并显示电压变化曲线
import matplotlib.pyplot as pltimport nestimport nest.voltage_tracenest.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()

运行结果如下:

  1. 经典神经元的电压变化曲线
# -*- coding: utf-8 -*-import matplotlib.pyplot as pltimport nestimport nest.voltage_tracenest.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.0lif.I_e = 376.0izhi.I_e = 376.0nest.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))#HHhh_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")#LIFlif_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")#Izhikevichizhi_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()

运行结果: