Python 具有PyMC的最简线性模型
假设我尝试使用以下数据估计一个简单的Python 具有PyMC的最简线性模型,python,statistics,statsmodels,pymc,Python,Statistics,Statsmodels,Pymc,假设我尝试使用以下数据估计一个简单的y=m*x问题的斜率: x_data = np.array([0,1,2,3]) y_data = np.array([0,1,2,3]) 很明显,坡度为1。然而,当我在PyMC中运行这个时,我得到10 slope = pm.Uniform('slope', lower=0, upper=20) @pm.deterministic def y_gen(value=y_data, x=x_data, slope=slope, observed=True)
y=m*x
问题的斜率:
x_data = np.array([0,1,2,3])
y_data = np.array([0,1,2,3])
很明显,坡度为1。然而,当我在PyMC中运行这个时,我得到10
slope = pm.Uniform('slope', lower=0, upper=20)
@pm.deterministic
def y_gen(value=y_data, x=x_data, slope=slope, observed=True):
return slope * x
model = pm.Model([slope])
mcmc = pm.MCMC(model)
mcmc.sample(100000, 5000)
# This returns 10
final_guess = mcmc.trace('slope')[:].mean()
但它应该是1
注意:以上是PyMC2。您需要定义一个可能性,请尝试以下操作:
import pymc as pm
import numpy as np
x_data = np.linspace(0,1,100)
y_data = np.linspace(0,1,100)
slope = pm.Normal('slope', mu=0, tau=10**-2)
tau = pm.Uniform('tau', lower=0, upper=20)
@pm.deterministic
def y_gen(x=x_data, slope=slope):
return slope * x
like = pm.Normal('likelihood', mu=y_gen, tau=tau, observed=True, value=y_data)
model = pm.Model([slope, y_gen, like, tau])
mcmc = pm.MCMC(model)
mcmc.sample(100000, 5000)
# This returns 10
final_guess = mcmc.trace('slope')[:].mean()
它返回10,因为您只是从统一的先验值中采样,10是该值的预期值。您需要设置
value=y\u data,observed=True
,以获取可能性。另外,还有一个小问题,您不需要实例化模型对象。只需将节点(或对locals()的调用)传递给MCMC即可 我不得不说,你使用的是哪一版本的Pymc?@dartdog-我刚刚更新了帖子。谢谢@twiecki-但是当我运行你的示例时,我得到了一个不同的错误:ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()