pymc3入门:从概率模型到贝叶斯推断
Pymc3是一个Python库,用于贝叶斯统计建模和推断。它提供了一个直观的语法,可用于指定概率模型,并使用马尔科夫链蒙特卡洛(MCMC)方法进行推断。在本文中,我们将了解如何使用Pymc3建立一个简单的线性回归模型,并使用MCMC进行参数推断。
首先,让我们考虑一个简单的线性回归问题。假设我们有一组输入变量X和相应的输出变量Y。我们的目标是找到一条 拟合线,以描述X和Y之间的关系。线性回归模型的方程可以表示为Y = a*X + b,其中a和b是模型的参数。
为了使用Pymc3进行推断,我们首先需要定义概率模型。在这个例子中,我们使用高斯分布作为误差项的先验分布,并使用平均值为0和标准差为1的正态分布作为参数a和b的先验分布。
首先,让我们导入必要的库和生成一些模拟数据:
import numpy as np import pymc3 as pm import matplotlib.pyplot as plt # 生成模拟数据 np.random.seed(0) n = 100 X = np.linspace(0, 10, n) Y = 2*X + np.random.randn(n)*0.5
接下来,我们定义模型并进行推断:
with pm.Model() as model:
# 定义参数的先验分布
a = pm.Normal('a', mu=0, sd=1)
b = pm.Normal('b', mu=0, sd=1)
# 定义观测值的概率分布
Y_obs = pm.Normal('Y_obs', mu=a*X + b, sd=0.5, observed=Y)
# 运行MCMC采样
trace = pm.sample(1000, tune=1000)
在上面的代码中,我们首先使用pm.Model()创建一个新的模型。然后,我们使用pm.Normal()将参数a和b定义为正态分布的随机变量,并指定其先验分布的均值(mu)和标准差(sd)。
接下来,我们使用pm.Normal()将观测值Y定义为a*X + b的正态分布随机变量,并指定观测值的先验分布的标准差(sd)。我们使用observed=Y参数来指定这些值是观测到的值,而不是随机变量。
最后,我们使用pm.sample()运行MCMC采样。我们指定采样的数量为1000次,并使用tune=1000参数来指定在收敛之前要丢弃的样本数量。
在推断完成后,我们可以检查参数的后验分布,并绘制拟合线和原始数据:
# 从trace中提取参数的后验样本
a_posterior = trace.get_values('a')
b_posterior = trace.get_values('b')
# 绘制拟合线
X_new = np.linspace(0, 10, 100)
Y_new = np.mean(a_posterior)*X_new + np.mean(b_posterior)
plt.plot(X_new, Y_new, color='red')
# 绘制原始数据
plt.scatter(X, Y)
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
在上面的代码中,我们首先使用trace.get_values()从MCMC采样的结果中提取参数a和b的后验样本。然后,我们使用提取的后验样本计算拟合线的均值,并将其绘制为红色线条。最后,我们使用plt.scatter()绘制原始的数据点,并添加适当的标签和图例。
通过运行上述代码,我们将得到一个包含拟合线和原始数据的图示,这样我们就可以观察模型的拟合效果和参数的不确定性。
这是一个简单的例子,展示了如何使用Pymc3进行概率建模和贝叶斯推断。Pymc3提供了许多其他功能,如其他分布类型、多模型比较、参数收敛诊断等。对于想要进一步探索贝叶斯推断的读者来说,使用Pymc3是一个很好的开始!
