贝叶斯推断

10

我有一台仪器,需要通过三个测试才能被视为成功。如何使用贝叶斯推断基于证据来查看每种情况通过的概率?(基于仪器依次通过每个过去测试)。

仅查看第一个测试 - 我知道这个来自仪器测试的历史记录。你也可以看到每个测试都有-3%到+3%的接受边界: enter image description here

我的假设:

  • 概率是相互依赖的 - 我们在三个测试中看同一台仪器

  • 从历史数据中我发现通过测试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)值。
感兴趣的是,所有三个测试看起来都很相似: enter image description here
2个回答

6
所以这里有几件事情要考虑。首先,您是对的,先验概率分别为0.5和0.5,因为这是我们数学上编码“不知道”正在发生什么的方式,但是您独立显示三个图形,并且只使用一个维度写Bayes方程,违反了您的依赖性假设。此外,在此设置中无需使用已边缘化的P(D)来获得所询问的条件概率。
您真正想要的是仪器在通过A测试和/或B测试时会通过C测试的条件概率
如果您只完成了A测试,则Bayes说:
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的概率,Bayes说:
P(C|A,B) = P(A,B|C)P(C)/P(A,B)
看起来更复杂,但问题是您实际上并不需要进行贝叶斯推断来获取所请求的条件概率:
"在已经通过或失败了该测试的情况下,我通过下一次测试的概率是多少?"
您拥有计算它们的所有所需信息。人们通常在没有这个奢侈的时候使用贝叶斯推断。
要回答您有关如何基于测试是否已经通过一个或多个测试来计算未来测试将通过的概率的问题,请考虑所需值的含义。
"给定仪器通过(或失败)测试1的情况下,它通过测试2和测试3的机会是多少"
使用您的历史数据,您可以直接回答这个问题。
您的问题声明您关心通过/失败的概率,因此每个测试只有2种可能的结果,这意味着您实际上只需要考虑每个仪器测试集的8个状态。
(测试A结果数)*(测试B结果数)*(测试C结果数)= 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的测试结果代替A的结果很容易,只需记住您要放置测试通过/失败数据的索引即可。


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

希望这对您有所帮助..


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接