费加罗概率编程参数学习

时间:2017-12-19 09:50:15

标签: machine-learning probability-theory figaro-lang

我目前开始研究图形概率模型。我已经读过这本书"实用概率编程"作者:Avi Pfeffer关于费加罗概率编程语言。作为练习,我试图从学习集中学习正态分布的参数。无论如何,我获得的数据并不是合理的预期 我已经定义了一个模型,其中正态分布取决于2个参数:均值是另一个正态分布,平均值为50,方差为0.01。方差是伽马分布ok 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

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

1 个答案:

答案 0 :(得分:2)

当您以正态均值定义先验时,您就得出了先验0.01的方差。从直觉上讲,这意味着您可以确定均值非常接近50。

除此之外,您可能会对知道 -Gamma分布是正态随机变量的方差参数的共轭先验条件感兴趣,只要知道平均值即可。同样,当均值和方差均未知时,正态伽玛双变量分布是共轭先验。

关于这些分布的Wikipedia页面将很好地为您服务,并且可以验证给定观察100次100次的后均值(具有您在此处定义的超参数)与50个相距不远。