Skip to main content
 首页 » 编程设计

python之贝叶斯法则——如何计算似然

2025年05月04日25mate10pro

给定一些数据,data,它对应于抛硬币的二进制序列,其中正面为 1,反面为 0。 Theta 是一个介于 0 和 1 之间的值,表示抛硬币时正面朝上的概率。

如何计算可能性?我依稀记得一个公式,其中:

likelihood = (theta)^(h)*(1-theta)^(1-h)  

如果正面朝上,h 为 1,如果反面朝上,则为 0。我实现了以下代码:

import numpy as np 
(np.prod([theta*1 for i in data if i==1]) * np.prod([1-theta for i in data if i==0])) 

此代码适用于某些情况但不适用于某些隐藏的情况(所以我不确定它有什么问题)。

请您参考如下方法:

有几种方法可以解释您要计算的内容:

  1. 确切顺序的概率,包括头部出现的顺序(这就是您的问题在这里提出的方式)
  2. 在你的序列中出现正面的次数(我们称之为 X)的概率,与顺序无关(我认为你要求的是这样)。

选项 1:

import numpy as np 
theta = 0.2      # Probability of H is 0.2, hence NOT a fair coin 
data = [0, 1, 0, 1, 1, 1, 0, 0, 1, 1]     # T, H, T, H, H, ....  
 
 
def likelihood(theta, h): 
    return (theta)**(h)*(1-theta)**(1-h) 
 
likelihood(theta, 1) # 0.2 
likelihood(theta, 0) # 0.8 
 
singlethrow = [likelihood(theta, x) for x in data] 
prob1 = np.prod(singlethrow)    # 2.6214400000000015e-05 

prob1 会很快收敛到零,因为每次额外抛硬币都会将现有概率乘以一个小于 1 的数字(正面为 0.2,反面为 0.8)

选项 2:

是二项分布。这将所有可能结果的概率加起来,当抛硬币 10 次时,总共产生 6 个正面朝上的概率。我们已经在上面的选项 1 中评估过的一个特定序列导致 10 次抛掷 6 次正面朝上。有 210 种这样的方式 ( = 10!/(6!*(10−6)!) )

scipy.stats.binom.pmf() 功能为您计算此概率:

import scipy, scipy.stats 
prob2 = scipy.stats.binom.pmf(6, 10, theta) 

或者,更一般地说,如果您依赖于我上面定义的形式的 data:

X = sum([toss == 1 for toss in data]) 
N = len(data) 
prob3 = scipy.stats.binom.pmf(X, N, theta) 
 
prob2 == prob3   # True