【问题标题】:Simplest linear model with PyMCPyMC 最简单的线性模型
【发布时间】:2014-04-09 22:52:05
【问题描述】:

假设我尝试使用以下数据估计一个简单的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 的。

【问题讨论】:

  • 我不得不记录一下,您使用的是哪个版本的 Pymc?
  • @dartdog - 我刚刚更新了帖子。

标签: python statistics statsmodels pymc


【解决方案1】:

你需要定义一个可能性,试试这个:

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 是它的预期值。

【讨论】:

  • 谢谢@twiecki - 但是当我运行你的例子时,我得到了一个不同的错误:ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
【解决方案2】:

您需要为可能性设置value=y_data, observed=True。此外,还有一点,您不需要实例化 Model 对象。只需将您的节点(或对 locals() 的调用)传递给 MCMC。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2017-02-02
    • 2021-05-13
    • 2014-05-20
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    相关资源
    最近更新 更多