假设我有(X,Y)点的随机集合:
import pymc as pm
import numpy as np
import matplotlib.pyplot as plt
import scipy
x = np.array(range(0,50))
y = np.random.uniform(low=0.0, high=40.0, size=200)
y = map((lambda a: a[0] + a[1]), zip(x,y))
plt.scatter(x,y)
我适合简单的线性回归:
std = 20.
tau=1/(std**2)
alpha = pm.Normal('alpha', mu=0, tau=tau)
beta = pm.Normal('beta', mu=0, tau=tau)
sigma = pm.Uniform('sigma', lower=0, upper=20)
y_est = alpha + beta * x
likelihood = pm.Normal('y', mu=y_est, tau=1/(sigma**2), observed=True, value=y)
model = pm.Model([likelihood, alpha, beta, sigma, y_est])
mcmc = pm.MCMC(model)
mcmc.sample(40000, 15000)
如何获取y_est[0]
,y_est[1]
,y_est[2]
的分布或统计信息..(请注意,这些变量对应于y
值估算值为每个输入x
值。
答案 0 :(得分:2)
在PyMC 2中,如果您对确定性的跟踪感兴趣,则应将确定性包装在Lambda
对象中(或用@deterministic
装饰一个函数)。在您的情况下,这将是:
y_est = Lambda('y_est', lambda a=alpha, b=beta: a + b * x)
然后您应该能够调用summary
方法或绘制节点,就像随机指标一样。
顺便说一句,您不需要实例化Model
对象,因为MCMC
已经为您执行了此操作。您所需要的只是:
mcmc = pm.MCMC([likelihood, alpha, beta, sigma, y_est])
或者更简洁:
mcmc = pm.MCMC(vars())
答案 1 :(得分:1)
按照@Chris的建议,以下工作:
x = pm.Uniform('x', lower=xmin, upper=xmax)
alpha = pm.Normal('alpha', mu=0, tau=tau)
beta = pm.Normal('beta', mu=0, tau=tau)
sigma = pm.Uniform('sigma', lower=0, upper=20)
# The deterministic:
y_gen = pm.Lambda('y_gen', lambda a=alpha, x=x, b=beta: a + b * x)
然后按如下方式从中抽取样本:
mcmc = pm.MCMC([x, y_gen])
mcmc.sample(n_total_samples, n_burn_in)
x_trace = mcmc.trace('x')[:]
y_trace = mcmc.trace('y_gen')[:]