贝叶斯推断

时间:2015-07-20 12:38:09

标签: probability bayesian

我有一种仪器可以通过或不通过一系列三项测试。该仪器必须通过所有三项测试才能被认为是成功的。我如何使用贝叶斯推理来查看基于证据传递每个案例的概率? (基于依次通过每个过去测试的工具)。

只看第一次测试 - 我从仪器测试的历史记录中了解到这一点。您还可以看到每个测试的接受边界为-3%到+ 3%: enter image description here

我的假设:

  • 概率相互依赖 - 我们在所有三项测试中都在查看相同的工具

  • 从这个历史数据我看到通过测试A的概率是P(A)= 0.84,所以失败的是P('A)= 0.16

  • 在不知道任何关于乐器的情况下,一个好的假设是通过概率的等概率。第一次测试失败 - 假设(H)是仪器通过P(H)= 0.5;这也给了我们失败概率P('H)= 0.5。

根据我的理解,我需要找到P(H)给定数据(D),用贝叶斯术语 - 我会在给定测试结果的情况下更新P(H) -

**P(H|D) = P(H) P(D|H) / P(D)**   Where:

**P(D) = P(D|H)*P(H)  + P(D|’H) P(‘H)**

这是我迷路的地方,我认为这是正确的:

P(H)    = P('H) = 0.5  // prob of passing/failing test-A without any information  

P(D|H)  = 0.84          // prob of passing test-A from historical records

P('D|H) = 0.16         // prob of failing test-A from historical records

P(D) = P(D|H)*P(H) + P(D|’H) P(‘H) = 0.84*0.5 + 0.16*0.5
P(D) = 0.5

给出贝叶斯值: P(H | D)= P(H)P(D | H)/ P(D)= 0.5 * 0.84 / 0.5, P(H | D)= 0.84 这是我在测试-B中对P(H)的新更新值?

出于兴趣,所有三项测试看起来都很相似: enter image description here

2 个答案:

答案 0 :(得分:5)

所以这里有几点需要考虑。首先你是正确的,使用的先验概率分别是.5和.5,因为它是我们在数学上编码不知道正在发生什么的方式,但你是相互独立地显示三个图形并且只用1维编写贝叶斯方程,这违反了你的依赖假设。此外,您无需在此设置中使用边缘化P(D)来获得您要询问的条件概率。

你真正关注的是仪器将通过测试C的条件概率,考虑它在测试A和/或测试B上的作用

如果您只完成了测试A,那么贝叶斯说:

  

P(C | A)= P(A | C)P(C)/ P(A)或P(B | A)= P(A | B)P(B)/ P(A)

其中A,B和C可以具有通过或失败的值。

如果您已经完成了测试A和B,那么您想知道通过测试C的可能性,贝叶斯所说的是:

  

P(C | A,B)= P(A,B | C)P(C)/ P(A,B)

这看起来要复杂得多,但问题是你真的不需要做贝叶斯推理来获得你要求的条件概率:

  

鉴于我已通过或未通过此测试,我通过下一次测试的概率是多少?

您拥有直接计算所需的所有信息。人们通常会在没有奢侈品的情况下使用贝叶斯推理。

要回答有关如何计算未来测试将通过的概率的问题,具体取决于它是否已通过一项或多项测试,请考虑您想要的值是什么意思。

  

“鉴于仪器通过(或失败)测试1,它将通过测试2和测试3的可能性是多少”

根据您的历史数据,您可以直接回答此问题。

您的问题表明您关心通过/失败的可能性,因此每个测试有2种可能的结果意味着您每个仪器测试集只需要考虑8个状态

  

(TestA结果数)*(TestB结果数)*(TestC结果数)= 2 * 2 * 2 = 8

要计算您想要的概率,请考虑一个3D矩阵,我们将其称为ProbabilityHistogram,其中包含每个结果的单元格。因此矩阵是2 * 2 * 2。通过历史上是否通过测试来索引矩阵。我们将使用此矩阵构建历史通过/失败数据的直方图,然后引用该直方图以在下面的代码中构建您感兴趣的概率。

  

在我们的方法中,先前测试的任何仪器通过测试A,测试B失败和通过测试C的次数将在ProbabilityHistogram [1,0,1]中找到,通过所有三个将在ProbabilityHistogram中找到[ 1,1,1],失败所有三个ProbabilityHistogram [0,0,0]等

以下是如何计算您想要的值

所需直方图的设置

  • 首先定义一个2 * 2 * 2矩阵来保存直方图数据
  • 阅读您的历史数据
  • 对于数据集中的每个历史测试,请使用下面的UpdateProbHisto代码更新ProbabilityHistogram

计算感兴趣的概率:

  • 使用下面的CProb_BCgA计算一次测试后的条件概率
  • 使用下面的CProb_CgAB进行两次测试后计算条件概率

代码:(很抱歉,它是在C#中,因为我在Python方面经验有限,如果您有任何疑问,请发表评论,我会进一步解释)

设置3D矩阵

//Define Probability Histogram
        double[, ,] ProbHisto = new double[2, 2, 2];// [A Test Outcome, B Test Outcome, C Test Outcome]

更新直方图

//Update Histogram based on historical data. 
        //pass in how the instrument did on each test as one dataset
        void updateProbHisto(bool APassed, bool BPassed, bool CPassed) {
            ProbHisto[Convert.ToInt16(APassed), Convert.ToInt16(BPassed), Convert.ToInt16(CPassed)]++;
        }

在一次测试后计算概率

//calculate the conditional probability that test B and test C will Pass given A's test reult
        double[] CProb_BCgA(bool ATestResult) {
            //Calculate probability of test B and test C success looking only at tests that passed or failed the same way  this instrument did given the A test result
        double[] rvalue = {0.0,0.0};//P(B|A), P(C|A)
            double BPassesGivenA = ProbHisto[Convert.ToInt16(ATestResult),1,0] + ProbHisto[Convert.ToInt16(ATestResult),1,1];
            double CPassesGivenA = ProbHisto[Convert.ToInt16(ATestResult),1,1] + ProbHisto[Convert.ToInt16(ATestResult),0,1];
            rvalue[0] = BPassesGivenA /(BPassesGivenA+ProbHisto[Convert.ToInt16(ATestResult),0,0] + ProbHisto[Convert.ToInt16(ATestResult),0,1]); // BPasses over BPasses + BFailures
            rvalue[1] = CPassesGivenA /(CPassesGivenA+ProbHisto[Convert.ToInt16(ATestResult),0,0] + ProbHisto[Convert.ToInt16(ATestResult),1,0]);// CPasses over CPasses + CFailures
            return rvalue;
        }

在两次测试后计算概率

//Calculate the conditional probability that test C will pass looking only at tests that passed or failed the same way this instrument did given the A and B test results
        double CProb_CgAB(bool ATestResult, bool BTestResult)
        {
            //Calculate probability of test C success given A and B test results
            double rvalue = 0.0;// P(C|A,B)
            double CPassesGivenAB = ProbHisto[Convert.ToInt16(ATestResult),Convert.ToInt16(BTestResult),1];
            rvalue= CPassesGivenAB /(CPassesGivenAB + ProbHisto[Convert.ToInt16(ATestResult),Convert.ToInt16(BTestResult),0]);// CPasses over CPasses + CFailures
            return rvalue;
        }

假设您测试A然后测试B然后测试C(BCgA =测试A的给定结果的B传递和C传递的概率),设置条件概率代码,但是在测试结果中可以直接测试对于B或C,我只想知道你将测试通过/失败数据放在哪个索引中的结果。

答案 1 :(得分:1)

正如Semicolons和Duct Tape所说,我也认为你根本不需要P(H)来回答这个问题。为了回答P(C | A),即通过测试C的概率,你通过了测试,你所需要的只是P(A& C)和P(A),这似乎已经可以使用了。 P(B | A)也是如此。

这是一个python片段,显示了这一点。假设结构实验是一个测试列表,其中每个测试是分别对应于测试A,测试B和测试C的结果(通过1,通过0)的三个数字的列表。

def prob_yx(y, x, exp):
    "P(y|x). Data is the past experimental runs"

    # P (X & Y)
    c_xy = filter(lambda _: _[x] & _[y], exp)
    # P (Y)
    c_x = filter(lambda _: _[x], exp)

    return len(c_xy) / float(len(c_x))


experiment = [
    [0, 0, 1],
    [1, 1, 1],
    [1, 0, 0],
    [1, 1, 1],
    [1, 1, 0]
]

A = 0
B = 1
C = 2

# B given A
print prob_yx(B, A, experiment)
# C given A
print prob_yx(C, A, experiment)
# C given B
print prob_yx(C, B, experiment)

这给出了

0.75
0.5
0.666666666667

希望这有用..