1 python statistics numpy probability bayesian
给定的是一些数据,data它对应于硬币翻转的二进制序列,其中头部为1,尾部为0.θ是介于0和1之间的值,表示硬币在翻转时产生头部的概率.
如何计算可能性?我依稀记得一个公式,其中:
likelihood = (theta)^(h)*(1-theta)^(1-h)
Run Code Online (Sandbox Code Playgroud)
其中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]))
Run Code Online (Sandbox Code Playgroud)
这段代码适用于某些情况,但不适用于某些隐藏的情况(所以我不确定它有什么问题).
有几种方法可以解释您要计算的内容:
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
Run Code Online (Sandbox Code Playgroud)
prob1 将很快收敛到零,因为每增加一次硬币投掷就会将现有概率乘以小于1的数字(如果是头部则为0.2,如果是尾部则为0.8)
选项2:
是二项分布.这增加了所有可能结果的概率,这些结果在投掷硬币10次时总共产生6个头.我们已经在上面的选项1中评估了一个特定的序列,它产生了6个头,共10个投掷.有210种这样的方式(= 10!/(6!*(10-6)!))
该scipy.stats.binom.pmf()功能为您计算此概率:
import scipy, scipy.stats
prob2 = scipy.stats.binom.pmf(6, 10, theta)
Run Code Online (Sandbox Code Playgroud)
或者,更一般地说,如果你依赖data我上面定义的形式:
X = sum([toss == 1 for toss in data])
N = len(data)
prob3 = scipy.stats.binom.pmf(X, N, theta)
prob2 == prob3 # True
Run Code Online (Sandbox Code Playgroud)