漏积分发放(LIF)神经元模型详解与实现
2025-07-10 07:29:44作者:廉皓灿Ida
引言
漏积分发放(Leaky Integrate-and-Fire, LIF)模型是最简单的生物神经元数学模型之一,由Louis Édouard Lapicque于1907年首次提出。这个模型虽然简化,但能够捕捉神经元的关键特性,包括膜电位的时间积分、阈值发放和不应期等基本特征。本文将详细介绍LIF模型的数学原理,并通过Python代码实现其仿真。
LIF模型数学原理
LIF模型描述神经元膜电位随时间变化的微分方程为:
其中:
- 是膜时间常数(ms)
- 是膜电容(nF)
- 是漏电导(nS)
- 是静息电位(mV)
- 是外部输入电流(pA)
当膜电位达到阈值时,神经元会发放一个动作电位(spike),随后膜电位被重置为,并进入时长的绝对不应期。
模型实现步骤
1. 参数初始化
首先我们需要定义模型参数和仿真参数:
def default_pars(**kwargs):
pars = {}
# 神经元参数
pars['V_th'] = -55. # 发放阈值(mV)
pars['V_reset'] = -75. # 重置电位(mV)
pars['tau_m'] = 10. # 膜时间常数(ms)
pars['g_L'] = 10. # 漏电导(nS)
pars['V_init'] = -75. # 初始电位(mV)
pars['E_L'] = -75. # 静息电位(mV)
pars['tref'] = 2. # 不应期(ms)
# 仿真参数
pars['T'] = 400. # 总仿真时长(ms)
pars['dt'] = 0.1 # 时间步长(ms)
# 添加额外参数
for k in kwargs:
pars[k] = kwargs[k]
pars['range_t'] = np.arange(0, pars['T'], pars['dt'])
return pars
2. LIF模型仿真实现
使用欧拉方法数值求解微分方程:
def run_LIF(pars, Iinj, stop=False):
# 获取参数
V_th, V_reset = pars['V_th'], pars['V_reset']
tau_m, g_L = pars['tau_m'], pars['g_L']
V_init, E_L = pars['V_init'], pars['E_L']
dt, range_t = pars['dt'], pars['range_t']
Lt = range_t.size
tref = pars['tref']
# 初始化
v = np.zeros(Lt)
v[0] = V_init
Iinj = Iinj * np.ones(Lt)
# 处理脉冲电流
if stop:
Iinj[:int(len(Iinj)/2)-1000] = 0
Iinj[int(len(Iinj)/2)+1000:] = 0
# 时间循环
rec_spikes = []
tr = 0.
for it in range(Lt-1):
if tr > 0: # 处于不应期
v[it] = V_reset
tr -= 1
elif v[it] >= V_th: # 发放动作电位
rec_spikes.append(it)
v[it] = V_th # 记录发放时刻
tr = tref/dt # 设置不应期
# 欧拉方法更新膜电位
v[it+1] = v[it] + (dt/tau_m) * (-(v[it]-E_L) + Iinj[it]/g_L)
# 转换为数组
rec_spikes = np.array(rec_spikes) * dt
return v, rec_spikes
3. 可视化函数
定义辅助函数用于可视化结果:
def plot_volt_trace(pars, v, sp):
V_th = pars['V_th']
dt, range_t = pars['dt'], pars['range_t']
if sp.size:
sp_num = (sp/dt).astype(int)-1
v[sp_num] += 20 # 突出显示发放
plt.plot(pars['range_t'], v, 'b')
plt.axhline(V_th, 0, 1, color='k', ls='--')
plt.xlabel('时间 (ms)')
plt.ylabel('膜电位 (mV)')
plt.legend(['膜电位', '阈值电位'])
plt.ylim([-80, -40])
plt.show()
模型应用示例
1. 恒定电流输入
pars = default_pars(T=1000)
I_inj = 200 # pA
v, sp = run_LIF(pars, I_inj)
plot_volt_trace(pars, v, sp)
2. 高斯白噪声输入
pars = default_pars(T=1000)
mu_gwn = 200 # 均值(pA)
sigma_gwn = 50 # 标准差(pA)
I_inj = mu_gwn + sigma_gwn * np.random.randn(len(pars['range_t']))
v, sp = run_LIF(pars, I_inj)
plot_volt_trace(pars, v, sp)
分析与讨论
LIF模型虽然简单,但能够展示神经元的一些关键特性:
- 阈值行为:只有当输入足够强使膜电位达到阈值时才会发放
- 时间积分:膜电位对输入进行时间上的积分
- 不应期:发放后短时间内不能再次发放
模型的局限性包括:
- 无法模拟真实的动作电位形状
- 忽略了离子通道的动态特性
- 线性积分假设过于简化
总结
本文详细介绍了LIF神经元模型的数学原理和Python实现。通过这个简单的模型,我们可以研究神经元对不同类型的输入(恒定电流、随机输入等)的响应特性。虽然简化,LIF模型仍然是理解神经元计算原理和构建大规模神经网络模拟的重要基础。