用pymc3和贝叶斯推断进行线性回归

4

我正在尝试使用pymc3掌握贝叶斯统计学。

我对这个简单的线性回归运行了以下代码:

#Generating data y=a+bx
import pymc3
import numpy as np
N=1000
alpha,beta, sigma = 2.0, 0.5, 1.0
np.random.seed(47)
X = np.linspace(0, 1, N)
Y = alpha + beta*X + np.random.randn(N)*sigma

#Fitting
linear_model = pymc3.Model()
with linear_model:
    alpha = pymc3.Normal('alpha', mu=0, sd=10)
    beta = pymc3.Normal('beta', mu=0, sd=10)
    sigma = pymc3.HalfNormal('sigma', sd=1)
    mu = alpha + beta*X
    Y_obs = pymc3.Normal('Y_obs', mu=mu, sd=sigma, observed=Y)

    start = pymc3.find_MAP(fmin=optimize.fmin_powell)
    step = pymc3.NUTS(scaling=start)
    trace = pymc3.sample(500, step, start=start)

我不明白"trace"代表什么意思。

如果我对贝叶斯理论的理解足够好,应该会有一个“信念”函数,该函数将获取"alpha"、"beta"和"sigma"并输出它们组合的概率。

我如何从"trace"变量中获取这个"belief"结构?

1个回答

8

trace是马尔科夫链蒙特卡罗(MCMC)过程的输出。给定数据后,它会收敛到参数的分布(例如信念)。

您可以使用以下方法查看trace

pymc3.traceplot(trace, vars=['alpha', 'beta', 'sigma'])

Trace Plot

如果您想要查看回归的每个点上的所有关联数据,可以按照以下方式操作:

import matplotlib.pyplot as plt

a = trace['alpha']
b = trace['beta']
x = np.linspace(0,1,N)

fig = plt.figure(figsize=(12,4))

ax = fig.add_subplot(1,2,1)
plt.scatter(X,Y, color='g', alpha=0.3)
for i in xrange(500):
  y = a[i] + b[i] * x
  plt.plot(x, y, 'b', alpha=0.02)

ax = fig.add_subplot(1,2,2)
for i in xrange(500):
  y = a[i] + b[i] * x
  plt.plot(x, y, 'b', alpha=0.02)
plt.show()

个人实现

注意: 看起来你的代码缺少以下这行代码: from scipy import optimize


我更新了实现图表,其中包括原始数据和仅实现(放大)的图表。 - inversion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接