首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >贝叶斯推理

贝叶斯推理
EN

Stack Overflow用户
提问于 2015-07-20 12:38:09
回答 2查看 773关注 0票数 10

我有一个仪器,它可以通过或不通过一系列的三项测试。该仪器必须通过所有三项测试才能被认为是成功的。我怎样才能用贝叶斯推理来根据证据来观察每一个案例通过的概率呢?(根据一种仪器依次通过每一个过去的测试)。

只看第一次测试--我从仪器测试的历史记录中知道这一点。您还可以看到,每个测试的接受范围为-3%至+3%:

我的假设是:

  • 概率是相互依赖的--在所有三种测试中,我们都在看同一台仪器。
  • 从这些历史数据中,我发现通过测试A的概率是P(A)=0.84,失败的概率是P(‘A)=0.16
  • 如果对一个仪器一无所知,一个很好的假设就是通过的概率&不通过第一次测试的概率假设(H)是仪器通过了P(H) = 0.5;这也给出了失败概率P(‘H)= 0.5。

根据我的理解,我需要找出P(H)给定的数据(D),用贝叶斯的术语-然后我会更新P(H),根据测试A的结果-

代码语言:javascript
复制
**P(H|D) = P(H) P(D|H) / P(D)**   Where:

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

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

代码语言:javascript
复制
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

给出的Bayesian值为:P(H_X_D)= P(H) P(D_X_H)/P(D_(D))= 0.5*0.84 / 0.5,P(H_X)= 0.84,这是我在试验-B中对P(H)的新更新值?

出于兴趣,这三种测试看起来都很相似:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-23 20:31:00

所以这里有几件事要考虑。首先,你是正确的,先验概率分别是.5和.5,因为这是我们数学上如何编码,不知道是怎么回事,但是你显示了三个相互独立的图,并且只写了一维的Bayes方程,这违反了你的依赖假设。此外,没有必要在这个设置中使用您的边缘化P(D)来获得您正在询问的条件概率。

你真正追求的是仪器通过测试C的条件概率,考虑到它在测试A和测试B上的表现。

如果你只做了A测试,那么Bayes说:

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

其中A、B和C的值可以是pass,也可以是失败。

如果您做过测试A和B,那么您想知道通过测试C的概率,Bayes说:

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,0,等等。

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

所需直方图的设置

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

计算感兴趣的概率:

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

代码:(抱歉是在C#中,因为我在Python方面的经验有限,如果您有问题,请留下评论,我将进一步解释)

建立三维矩阵

代码语言:javascript
复制
//Define Probability Histogram
        double[, ,] ProbHisto = new double[2, 2, 2];// [A Test Outcome, B Test Outcome, C Test Outcome]

更新直方图

代码语言:javascript
复制
//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)]++;
        }

一次测试后计算概率

代码语言:javascript
复制
//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;
        }

两次测试后的概率计算

代码语言:javascript
复制
//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 =B通过概率和C通过,给定测试A的结果),但是在测试结果B或mind的测试结果中,只需考虑将测试通过/失败数据放入哪个索引中,这是很简单的。

票数 6
EN

Stack Overflow用户

发布于 2015-07-30 04:18:09

正如分号和管道胶带所说,我也不认为你需要P(H)来回答这个问题。要回答什么是P(C\A),即给出通过测试C的概率,您所需要的只是P(A & C)和P(A),这对您来说似乎是可用的。P(B~+-A)的情况也是如此。

这里有一个python代码片段,它显示了这一点。假设结构实验是一个测试列表,其中每个测试都是与测试A、测试B和测试C的结果对应的三个数字的列表(考试A、测试B和测试C的结果分别为1、0和0)。

代码语言:javascript
复制
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)

这给了我们

代码语言:javascript
复制
0.75
0.5
0.666666666667

希望这有帮助..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31516732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档