使用网格搜索在 python 中为经典硬币翻转创建后验分布

数据挖掘 Python 统计数据 贝叶斯
2022-02-25 22:55:24

我正在阅读“使用 Python 进行贝叶斯分析”一书,作者提供了一些 Python 代码,旨在展示为经典抛硬币示例获取近似后验分布的网格搜索方法。在这个例子中,我们设置了获得正面的概率的先验,然后给定一些数据,我们的可能性是二项式分布。

因此,根据我对使用网格搜索的理解,我们将打破间隔[0,1]成块,在我们的例子中是 100。我们有一个先验概率P(θ=θ0)对于离散网格中的每个点,我们将其乘以P(D|θ=θ0)我们将它们相乘以获得每个位置的非标准化估计值。

代码如下

def posterior_grid_approx(grid_points=100, heads=6, tosses=9):
    grid = np.linspace(0, 1, grid_points)
    prior=np.repeat(5,grid_points)
    likelihood=stats.binom.pmf(heads, tosses, grid)
    unstd_posterior = likelihood * prior
    posterior = unstd_posterior / unstd_posterior.sum()    
    return grid, posterior

我不明白为什么先验设置为5's 这不是一个概率值吗?据我了解,他们已将网格分成 100 个不同的点,为每个位置获得二项式 pmf,然后将数字乘以 5。这是一个有效的先验吗?

如果有人能清楚地解释这背后的原因,我将非常感激,因为我喜欢像理解概念一样清楚地理解代码。谢谢!

1个回答

简而言之

该问题假设一个均匀的先验分布函数。一切可能P(H)同样可能。因为他们最终将概率分布函数标准化,所以放置什么值并不重要

prior=np.repeat(1,grid_points)

似然函数

似然函数回答了这个问题,即我们假设的先验概率有多大。

例如,当掷一枚公平的硬币时,我们可以假设出现正面的概率为P(H)=0.5. 现在,如果我们做一个实验,在 3 次翻转中我们观察到 3 个正面,那么P(HHH|P(H)=0.5)=0.53. 这告诉我们,我们选择正确的先验概率只有 0.125。

PosteriorLikelihood×Prior

编码

正如您所观察到的,奇怪的是他们将整个列表设置为5. 但是,这对结果没有影响,因为最后一行对结果进行了标准化。尝试更改5到一个不同的值,你会看到你的结果保持不变。

让我们看一下代码

grid = np.linspace(0, 1, grid_points)

这将创建一个数组01. 这是我们将假设计算可能性的不同概率。例如,如果我们使用 5grid_points我们有[0,0.25,0.5,0.75,1]. 所以我们假设P(H)依次等于这些值并获得每个值的结果可能性。

likelihood=stats.binom.pmf(heads, tosses, grid)

我们现在可以随心所欲地提前出发。我们可以假设硬币是公平的,或者我们没有任何线索,只是假设它是均匀分布的。这基本上就是他们在这里所做的。他们选择的值对结果没有影响。但是,我认为为了清楚起见,将其设为 1 更为明显。

prior=np.repeat(1,grid_points)

为了计算后验,我们将先验乘以似然

unstd_posterior = likelihood * prior

然后为了得到一个概率分布函数,我们对该函数进行标准化。

posterior = unstd_posterior / unstd_posterior.sum()