所以这里有几件事需要考虑。首先你是对的,使用的先验概率分别是 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 的结果中只考虑您将测试通过/失败数据放入哪个索引。