无法复制贝叶斯推理的简单示例

机器算法验证 贝叶斯
2022-03-18 17:22:49

在 John Kruschke 的《做贝叶斯数据分析》一书(第 2 版)的第 20-21 页上,有一个贝叶斯推理的介绍性插图。我们知道球可以有四种尺寸:1、2、3和4,但是制造过程并不完美,所以经验观察的球有1.77、2.23和2.7的尺寸。

现在,假设是:

  • 三个观察到的球被生产为相同标称尺寸的球,
  • 这个例子中的先验对于每种球类型都是 0.25,
  • 球尺寸变化的分布是正常的,并且以每种球类型的球尺寸为中心。

我们想测量这个样本最可能的标称尺寸:1、2、3 或 4。

在本书的这个阶段,这个问题仅用于展示观察数据时后验如何变化,并没有提供计算。但是,作者确实提供了准确的结果:

...有 56% 的概率是 2 号球,31% 的概率是 3 号球,11% 的概率是 1 号球,只有 2% 的概率是 4 号球。

我试图复制这个结果,但我失败了。我的逻辑如下:

我有:θ{1,2,3,4}和:data{1.77,2.23,2.7}.

给定贝叶斯公式:

p(θ|data)=p(data|θ)×p(θ)p(data)=p(data|θ)×p(θ)i=14p(data|θi)×p(θi)

自从p(θ)=0.25对于所有值,我可以将其分解为分母,然后取消,所以我只剩下:

p(θ|data)=p(data|θ)i=14p(data|θi)

对于分子,我必须计算以下内容:

p(data|θ)=N(data1|θ,1)×N(data2|θ,1)×N(data3|θ,1)

例如:

p(1.77,2.23,2.7|2)=N(1.77|2,1)×N(2.23|2,1)×N(2.7|2,1)

这转化为 Python 为:

import numpy as np    
from scipy.stats import norm
mean_2 = np.prod(norm.pdf([1.77, 2.23, 2.7], loc=2, scale=1))

所以,完整的计算p(θ|data)应该看起来像:

mean_1 = np.prod(norm.pdf([1.77, 2.23, 2.7], loc=1, scale=1))
mean_2 = np.prod(norm.pdf([1.77, 2.23, 2.7], loc=2, scale=1))
mean_3 = np.prod(norm.pdf([1.77, 2.23, 2.7], loc=3, scale=1))
mean_4 = np.prod(norm.pdf([1.77, 2.23, 2.7], loc=4, scale=1))
posterior_2 = mean_2 / (mean_1 + mean_2 + mean_3 + mean_4)

我的假设是,它posterior_2的值应该接近56%John Kruschke 提到的值,但实际上接近64%(乘以 后100)。

我看到造成这种差异的两个原因:

  • 在学习贝叶斯数据分析的早期阶段,我的逻辑有一些错误(你看到了吗?),
  • 书中没有足够的信息来复制结果。

后者是可能的,因为作者没有说明这些正态分布的标准偏差值。我假设它是1.

0个回答
没有发现任何回复~