1

我目前已经开始研究图形概率模型。我读过 Avi Pfeffer 关于 Figaro 概率编程语言的“实用概率编程”一书。作为练习,我试图从学习集中学习正态分布的参数。无论如何,我获得的数据并不完全是合理的预期。
我定义了一个模型,其中正态分布取决于 2 个参数:平均值是另一个正态分布,平均值为 50,方差为 0.01。方差是一个伽马分布,k=2 和 theta=2。
我正在进行 100 次观察,每个观察值为 100。我使用重要性采样算法推断均值和方差。这是代码

val mean : Element[Double] = Normal(50,0.01)
val variance: Element[Double] = Gamma(2,2)
val tripDistances = for(i<-Range(1,100)) yield Chain(mean, variance,(m:Double, v:Double) 
    => Normal(mean,variance))
for {t <- tripDistances} {t.observe(100) }
var importance = Importance(10000, mean,variance)
importance.start()
val expectedMeanVal = importance.computeExpectation(mean, (m: Double) => m)
val expectedVarianceVal = importance.computeExpectation(variance, (v: Double) => v)
importance.kill()
println("the mean = " + expectedMeanVal)
println("the variance = " + expectedVarianceVal)

这是输出:

the mean = 49.905560193556994
the variance = 23.82362490526008

就像观察对参数的概率分布没有任何影响一样。这很奇怪(我肯定遗漏了一些东西),因为我将两个元素(均值和方差)链接起来以创建正态分布,然后我观察实际值。我希望有人可以帮助我。谢谢。

4

1 回答 1

2

当您在正态均值上定义先验时,您的先验方差为 0.01。直观地说,这意味着您非常确定平均值非常接近 50。

除此之外,您可能有兴趣知道-Gamma 分布是正态随机变量的方差参数的共轭先验,前提是均值已知。类似地,当均值和方差都未知时,正态伽马双变量分布是共轭先验。

这些分布的维基百科页面将为您提供很好的服务,并且可以验证后验均值(使用您在此处定义的超参数)在您观察 100 次的情况下与 50 相差不远。

于 2018-07-10T20:24:45.400 回答