所以这里有几件事情要考虑。首先,您是对的,先验概率分别为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]
更新直方图
//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)]++;
}
计算一次测试后的概率
double[] CProb_BCgA(bool ATestResult) {
double[] rvalue = {0.0,0.0};
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]);
rvalue[1] = CPassesGivenA /(CPassesGivenA+ProbHisto[Convert.ToInt16(ATestResult),0,0] + ProbHisto[Convert.ToInt16(ATestResult),1,0]);
return rvalue;
}
计算两次测试后的概率
double CProb_CgAB(bool ATestResult, bool BTestResult)
{
double rvalue = 0.0;
double CPassesGivenAB = ProbHisto[Convert.ToInt16(ATestResult),Convert.ToInt16(BTestResult),1];
rvalue= CPassesGivenAB /(CPassesGivenAB + ProbHisto[Convert.ToInt16(ATestResult),Convert.ToInt16(BTestResult),0]);
return rvalue;
}
条件概率代码是在假定您先进行A测试,然后进行B测试和C测试的情况下设置的(BCgA = 在测试A的结果下,B测试通过且C测试通过的概率),但是将B或C的测试结果代替A的结果很容易,只需记住您要放置测试通过/失败数据的索引即可。