我目前已经开始研究图形概率模型。我读过 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
就像观察对参数的概率分布没有任何影响一样。这很奇怪(我肯定遗漏了一些东西),因为我将两个元素(均值和方差)链接起来以创建正态分布,然后我观察实际值。我希望有人可以帮助我。谢谢。