【问题标题】:Learning a single parameter in pymc在pymc中学习单个参数
【发布时间】:2016-05-21 06:06:35
【问题描述】:

我是 pymc 的初学者,对贝叶斯学习也很陌生。因此,由于缺乏理解,这个问题可能看起来很尴尬。

我完成了教程,然后尝试了我自己的示例。我使用x = np.random.exponential(0.25, 500)生成了一些指数分布的数据x,然后我想学习指定分布的lambda参数(在本例中为1/0.25=4)。

from pymc3 import Model, Exponential, find_MAP

# x is an array of pre-generated exponentially distributed data points
basic_model = Model() 
with basic_model:
    Y_obs = Exponential("Y_obs", lam=4, observed=x)

map_estimate = find_MAP(model=basic_model)

但是,我得到:

ValueError: zero-size array to reduction operation maximum which has no identity

我后来设法使用此代码获得了似乎正确的结果:

from pymc3 import Model, Exponential, HalfNormal, find_MAP, sample, traceplot
basic_model = Model()

with basic_model:
    lam = HalfNormal("lam", sd=1)
    Y_obs = Exponential("Y_obs", lam=lam, observed=x)
    start = find_MAP(model=basic_model)
    trace = sample(2000, start=start)

traceplot(trace)

是这样吗?我不明白的是为什么我需要另一个分布作为 lambda 参数(HalfNormal 甚至可行吗?)来模拟指数分布,即为什么仅指定 one 分布是不够的,即指数分布我感兴趣的分布。

我不确定我缺乏理解是在 pymc 还是在一般的统计问题。

感谢您的澄清!

【问题讨论】:

    标签: pymc pymc3


    【解决方案1】:

    在贝叶斯统计中,如果您不知道参数的值,那么您必须为其指定先验。

    当你写作时

    Y_obs = Exponential("Y_obs", lam=4, observed=x)
    

    您是说您知道零不确定性的参数值正好是 4。

    相反,在第二个示例中,您正在做正确的事情。您正在指定先验、HalfNormal 分布,然后是可能性(指数)。如果您检查贝叶斯定理,您会注意到您有两个项先验和可能性。您总是需要至少 1 个先验和 1 个可能性,并且通常对于更复杂的模型,您将拥有多个先验(每个要学习的参数一个)

    【讨论】:

      猜你喜欢
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      • 2013-02-18
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多