【问题标题】:Bayesian inference贝叶斯推理
【发布时间】:2015-10-09 14:09:01
【问题描述】:

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

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

我的假设:

  • 概率是相互依赖的——我们在所有三个测试中都使用同一个工具

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

  • 在不了解仪器的情况下,一个好的假设是通过和未通过第一次测试的概率相等 - 假设 (H) 是仪器通过了 P(H) = 0.5;这也给了我们失败的概率 P(‘H) = 0.5。

根据我的理解,我需要用贝叶斯术语在给定数据 (D) 的情况下找到 P(H) - 然后我会根据测试 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)**

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

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) 的新更新值?


出于兴趣,所有三个测试看起来都相似:

【问题讨论】:

    标签: probability bayesian


    【解决方案1】:

    正如分号和胶带所说,我也认为您根本不需要 P(H) 来回答这个问题。要回答什么 P(C|A),即在您通过测试的情况下通过测试 C 的概率,您只需要 P(A & C) 和 P(A),这似乎已经可供您使用。 P(B|A)也是如此。

    这里有一个 python sn-p 显示了这一点。假设结构实验是一个测试列表,其中每个测试是一个由三个数字组成的列表,分别对应于测试 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
    

    希望这有帮助..

    【讨论】:

      【解决方案2】:

      所以这里有几件事需要考虑。首先你是对的,使用的先验概率分别是 0.5 和 0.5,因为这是我们在数学上编码不知道发生了什么的方式,但是你正在独立地显示三个图并编写只有一维的贝叶斯方程,这违反了您的依赖假设。此外,无需在此设置中使用您的边缘化 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 代码更新概率直方图

      计算感兴趣的概率:

      • 使用下面的 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,在 A 的结果中只考虑您将测试通过/失败数据放入哪个索引。

      【讨论】:

        猜你喜欢
        • 2013-05-28
        • 1970-01-01
        • 2017-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-30
        • 1970-01-01
        • 2018-12-01
        相关资源
        最近更新 更多