学习pymc中的单个参数

时间:2016-05-20 21:49:46

标签: pymc pymc3

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

我完成了本教程,之后我尝试了自己的例子。我使用x生成了一些指数分布的数据x = np.random.exponential(0.25, 500),然后我想学习指定分布的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甚至可行?)来建模指数分布,即为什么它不足以指定一个分布,即我感兴趣的指数分布。

我不确定我的缺乏理解是否存在于pymc或统计问题中。

感谢您的澄清!

1 个答案:

答案 0 :(得分:1)

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

写作时

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

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

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