拜耳的规则 - 如何计算可能性

时间:2016-11-15 07:02:26

标签: python numpy statistics probability bayesian

给定一些数据data,其对应于硬币翻转的二进制序列,其中头是1并且尾部是0' s。 θ是介于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]))

此代码适用于某些情况但不适用于某些隐藏的情况(因此我不确定它的错误)。

2 个答案:

答案 0 :(得分:5)

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

  1. 确切地说明该序列的概率,包括头部发生的顺序(这就是你在这里提出的问题)
  2. 序列中出现的头数(让我们称之为X)的概率,无论顺序如何(这是我认为你要求的)。
  3. 选项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中评估了一个特定的序列,它产生了6个10个投掷头。有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 
    

答案 1 :(得分:0)

如果您对贝叶斯方法感兴趣,可能需要查看select DrugID, Drugs.Name, sum(InputDetails.Quantity) as 'Quantity' from InputDetails inner join Drugs on Drugs.ID = InputDetails.DrugID cross join Output inner join OutputDetails on OutputDetails.OutputID = Output.ID group by DrugID, Name;

conjugate_prior