贝叶斯推断

Har*_*ime 10 probability bayesian

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

只看第一次测试 - 我从仪器测试的历史记录中了解到这一点.您还可以看到每个测试的接受边界为-3%到+ 3%: 在此输入图像描述

我的假设:

  • 概率相互依赖 - 我们在所有三个测试中都在查看相同的仪器

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

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

根据我的理解,我需要找到P(H)给定数据(D),用贝叶斯术语 - 我会在给定测试A的结果的情况下更新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)**
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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


出于兴趣,所有三个测试看起来都相似: 在此输入图像描述

Sem*_*ape 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的可能性是多少"

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

您的问题表明您关心通过/失败的可能性,因此每个测试有两种可能的结果意味着您每个仪器测试集实际上只有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]
Run Code Online (Sandbox Code Playgroud)

更新直方图

//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)]++;
        }
Run Code Online (Sandbox Code Playgroud)

一次测试后计算概率

//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;
        }
Run Code Online (Sandbox Code Playgroud)

计算两次测试后的概率

//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;
        }
Run Code Online (Sandbox Code Playgroud)

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