NeuromatchAcademy课程:贝叶斯决策模型拟合实战指南
2025-07-10 07:41:49作者:胡易黎Nicole
简介
在神经科学和认知科学领域,贝叶斯决策理论为我们理解大脑如何处理不确定信息提供了强大的框架。本教程将带您深入探索如何将贝叶斯模型拟合到实验数据中,特别关注多感官整合场景下的参数估计问题。
核心概念
生成模型概述
我们研究的生成模型包含以下关键组件:
- 真实刺激(x):实验中呈现给参与者的刺激位置
- 神经编码(ẋ):大脑对真实刺激的噪声表征
- 似然函数p(ẋ|x):给定真实刺激下神经编码的概率分布
- 先验分布p(x):大脑对刺激位置的先验知识
- 后验分布p(x|ẋ):结合先验和似然后的最优估计
- 行为响应(ẍ):参与者最终报告的位置估计
实战步骤详解
1. 构建似然函数阵列
def compute_likelihood_array(x_points, stim_array, sigma=1.):
"""计算似然函数二维阵列
参数:
x_points: 可能刺激位置的数组
stim_array: 假设的神经编码值数组
sigma: 高斯分布标准差
返回:
二维数组,每行对应一个神经编码的似然函数
"""
likelihood_array = np.zeros((len(stim_array), len(x_points)))
for i, stim in enumerate(stim_array):
likelihood_array[i, :] = my_gaussian(x_points, mu=stim, sigma=sigma)
return likelihood_array
这个函数创建了一个二维数组,其中:
- 每行对应一个特定的神经编码值(ẋ)
- 每列对应一个可能的真实刺激位置(x)
- 每个元素表示给定真实刺激下观察到特定神经编码的概率
2. 构建混合先验分布
def compute_prior_array(x_points, p_common, prior_sigma_common=1., prior_sigma_independent=10.):
"""计算混合先验分布
参数:
x_points: 刺激位置数组
p_common: 共同原因概率
prior_sigma_common: 共同原因先验标准差
prior_sigma_independent: 独立原因先验标准差
返回:
先验概率分布数组
"""
prior_common = my_gaussian(x_points, 0, prior_sigma_common)
prior_independent = my_gaussian(x_points, 0, prior_sigma_independent)
return p_common * prior_common + (1 - p_common) * prior_independent
混合先验反映了大脑对刺激来源的预期:
- 95%概率刺激来自中心位置(共同原因)
- 5%概率刺激来自更广泛分布(独立原因)
3. 计算后验分布
def compute_posterior_array(likelihood_array, prior_array):
"""计算后验分布阵列
参数:
likelihood_array: 似然函数二维数组
prior_array: 先验分布数组
返回:
后验分布二维数组
"""
posterior_array = np.zeros_like(likelihood_array)
for i in range(likelihood_array.shape[0]):
unnormalized_posterior = likelihood_array[i, :] * prior_array
posterior_array[i, :] = unnormalized_posterior / np.sum(unnormalized_posterior)
return posterior_array
后验分布通过贝叶斯定理将先验和似然相结合,反映了大脑对刺激位置的最优估计。
4. 生成行为响应
def compute_responses(posterior_array, x_points):
"""计算行为响应
参数:
posterior_array: 后验分布数组
x_points: 刺激位置数组
返回:
响应位置数组
"""
responses = np.zeros(posterior_array.shape[0])
for i in range(posterior_array.shape[0]):
mean, _, _ = moments_myfunc(x_points, posterior_array[i, :])
responses[i] = mean
return responses
我们假设参与者会报告后验分布的均值作为他们的估计。
模型拟合实战
1. 生成模拟数据
# 设置真实参数
true_p_common = 0.95
true_stim = np.linspace(-5, 5, 20)
# 生成行为数据
prior_array = compute_prior_array(x, true_p_common)
posterior_array = compute_posterior_array(likelihood_array, prior_array)
simulated_responses = compute_responses(posterior_array, x)
2. 定义负对数似然函数
def negative_log_likelihood(p_common, x_points, hypothetical_stim, responses, true_stim):
"""计算负对数似然
参数:
p_common: 待测试的共同原因概率
x_points: 刺激位置数组
hypothetical_stim: 假设神经编码数组
responses: 观察到的行为响应
true_stim: 真实刺激位置
返回:
负对数似然值
"""
# 计算模型预测
prior_array = compute_prior_array(x_points, p_common)
posterior_array = compute_posterior_array(likelihood_array, prior_array)
predicted_responses = compute_responses(posterior_array, x_points)
# 找到最接近真实刺激的预测
model_responses = np.interp(true_stim, hypothetical_stim, predicted_responses)
# 计算误差
errors = responses - model_responses
sigma_error = 1 # 假设观测噪声
log_likelihood = np.sum(-0.5 * (errors / sigma_error)**2 - 0.5 * np.log(2 * np.pi * sigma_error**2))
return -log_likelihood
3. 执行参数估计
# 设置初始猜测
initial_guess = np.array([0.5])
# 优化寻找最佳参数
result = minimize(negative_log_likelihood, initial_guess,
args=(x, hypothetical_stim, simulated_responses, true_stim),
bounds=[(0.01, 0.99)])
estimated_p_common = result.x[0]
print(f"真实p_common: {true_p_common:.2f}, 估计p_common: {estimated_p_common:.2f}")
结果分析
通过上述步骤,我们可以:
- 成功恢复用于生成模拟数据的真实参数
- 验证模型拟合过程的有效性
- 理解贝叶斯模型如何解释参与者的行为模式
典型的拟合结果会显示估计参数接近真实值,验证了我们的模型和拟合方法的正确性。
总结
本教程详细介绍了:
- 贝叶斯决策模型的数学基础
- 从似然、先验到后验的计算流程
- 模型参数估计的完整流程
- 使用模拟数据验证模型的方法
这种框架不仅适用于当前的多感官整合问题,也可以推广到其他需要建模认知过程的场景中。通过调整似然和先验的具体形式,我们可以构建适用于各种实验范式的贝叶斯模型。