在Mathematica中如何计算条件概率?是否可行?

13

Mathematica能否自动进行贝叶斯公式的条件概率计算?如何实现?

我已经在Mathematica文档和网络上搜索了很久,但没有找到任何线索。我不是想知道如何手动使用Mathematica进行贝叶斯公式计算,而是想知道是否有一种方式来定义条件概率并自动计算其他概率。

假设采用伯努利分布的玩具示例:

P(Cancer+) = 0.01
P(Cancer-) = 0.99

P(Test+|Cancer+) = 0.9
P(Test-|Cancer+) = 0.1
P(Test+|Cancer-) = 0.2
P(Test-|Cancer-) = 0.8

能否计算出

P(Cancer+|Test+) = 0.0434

因此使用以下内容。

Print["P(C+) = ", PCancerT=BernoulliDistribution[0.01]];
Print["P(C-) = ", PCancerF=BernoulliDistribution[0.99]];
Print[]
Print["P(T+|C+) = ", PTestTGivenCancerT=BernoulliDistribution[0.9]];
Print["P(T-|C+) = ", PTestFGivenCancerT=BernoulliDistribution[0.1]];
Print["P(T+|C-) = ", PTestTGivenCancerF=BernoulliDistribution[0.2]];
Print["P(T-|C-) = ", PTestFGivenCancerF=BernoulliDistribution[0.8]];
Print[]
Print["P(T+,C+) = ", PTestTAndCancerT = Probability[vCT&&vTTCT,{vCT\[Distributed]PCancerT,vTTCT\[Distributed]PTestTGivenCancerT}]];
Print["P(T-,C+) = ", PTestFAndCancerT = Probability[vCT&&vTFCF,{vCT\[Distributed]PCancerT,vTFCF\[Distributed]PTestFGivenCancerT}]];
Print["P(T+,C-) = ", PTestTAndCancerF = Probability[vCF&&vTTCF,{vCF\[Distributed]PCancerF,vTTCF\[Distributed]PTestTGivenCancerF}]];
Print["P(T-,C-) = ", PTestFAndCancerF = Probability[vCF&&vTTCF,{vCF\[Distributed]PCancerF,vTTCF\[Distributed]PTestFGivenCancerF}]];
Print[]
Print["P(C+|T+) = ?"];
Print["P(C+|T-) = ?"];
Print["P(C-|T+) = ?"];
Print["P(C-|T-) = ?"];

我可以通过手动定义所有概率表来计算联合概率,但是有没有办法让Mathematica来处理这些繁重的工作?是否有一种方法来定义和计算这些条件概率?

非常感谢任何帮助,即使它只是“你不能做到...也要尝试” :)

PS:这是对做类似事情的一次尝试吗?Mathematica中的符号条件期望

2个回答

13
实际上,我曾经以符号方式解决过这个问题,并涵盖了许多简单(未链接)的概率。我想增加链接也不是那么难(见下文)。欢迎您回复并进行补充。符号方法比使用伯努利分布和创建贝叶斯定理的过程更加灵活,并且每次考虑正确的应用方法。
注意:函数没有绑定,就像上面的帖子中一样 ((0<pC< 1) && (0<pTC< 1) && (0<pTNC< 1)) ,因为有时您想要“非加权”结果,这会产生超出0-1范围的数字,然后您可以通过除以某些归一化概率或概率乘积将其带回范围内。如果您确实想添加边界以进行错误检查,请执行以下操作:
P [A_ /; 0 < = A < = 1]:= some_function_of_A; 在Mathematica中使用 Esc + cond + Esc 输入 \\ [Conditioned] 符号。
Remove[P];
Unprotect@Intersection;
Intersection[A_Symbol, B_Symbol] := {A, B}
Intersection[A_Not, B_Symbol] := {A, B}
Intersection[A_Symbol, B_Not] := {A, B}
P[Int_List/; Length@Int == 2] := P[Int[[2]] \[Conditioned] Int[[1]]] P[Int[[1]]]
   (*//  P(B) given knowledge of P(A)  //*)
P[B_, A_] := If[NumericQ@B, B, 
                P[B \[Conditioned] A] P[A] + P[B \[Conditioned] Not@A] P[Not@A]]
P[Not@B_, A_: 1] := If[NumericQ@A, 1 - P[B], 1 - P[B, A]]
P[A_ \[Conditioned] B_] := P[A \[Intersection] B]/P[B, A]
P[Not@A_ \[Conditioned] B_] := 1 - P[A \[Conditioned] B];

你可以像这样使用它:
P[Cancer]=0.01;

不需要写“非癌症”,因为P[!Cancer]的结果是0.99Esc+not+Esc可以输入漂亮的逻辑非符号,但Not[A]!A\[Not]A也可以正常工作)。

P[Test \[Conditioned] Cancer] = 0.9
P[Test \[Conditioned] ! Cancer] = 0.2

再次说明:P[!测试\\[条件] 癌症]将按定义成为1-P[测试\\[条件] 癌症],除非您对其进行了覆盖。

现在让我们查询此模型:

P[Test, Cancer]
P[!Test, Cancer]

返回值

0.207
0.793

并且
P[Cancer \[Conditioned] Test]
P[!Cancer \[Conditioned] Test]
P[Cancer \[Conditioned] !Test]
P[!Cancer \[Conditioned] !Test]

返回值

0.0434783
0.956522
0.00126103
0.998739

我认为定义P(B|A1,A2,A3,...,An)是一个好主意,有人愿意使用NestList或类似方法编写链式规则吗?虽然我在项目中并不需要它,但如果有人需要的话,添加它也不会太难。


谢谢。我之前在这里有另一个账户,但现在不记得它是什么了。从零开始建立声誉。感谢@Mr.Wizard的鼓励。 - Gregory Klopper
Gregory,我相信你可以自己完成,除非新用户权限已更改。 你应该在你上面的帖子下方看到一个灰色的链接,上面写着“flag”-- 点击它,然后选择“需要♦版主注意”,然后选择“其他”。 在框中,请求账户合并,并包括“users/959803/gr3gk1”如上所述。 如果你有困难,我会为你做这件事,但从你来说更有意义。 - Mr.Wizard
请求已接受!感谢您的帮助!你是这个网站真正的财富! - Gregory Klopper
@GregoryKlopper 你可能想尝试回答这个问题 https://dev59.com/o2sy5IYBdhLWcg3w2Bg6 - user616736
这太棒了。不过我很惊讶Mathematica没有内置类似的东西? - kmace
显示剩余4条评论

5
我不会用Print语句和BernoulliDistribution来复杂化问题。你已经知道了概率,所以最简单的方法就是直接计算它们,但也许可以使用向量来获得P(B),并利用pr(癌症)=1-pr(非癌症)等事实。
贝叶斯定理表明,P(A|B)=(P(A ⋂ B))/(P(B))。
交集可以通过条件概率(给定癌症的测试)乘以癌症概率来计算。
因此,以下类似的代码应该可以工作:
conditionalProb[pC_, pTC_, pTNC_] /; 
 (0 < pC < 1) && (0 < pTC < 1) && (0 < pTNC < 1) :=
 (pTC * pC)/({pTC, pTNC}.{pC, 1 - pC})

conditionalProb[0.01, 0.9, 0.2]

0.0434783

是的,版本8中的概率功能确实可以“自动计算”条件概率,但对于像这样具有伯努利分布事件的问题来说,它有些过头了。


谢谢,打印只是为了尝试让在mma中执行时更清晰地表达我想要实现的目标,也许适得其反。至于答案,我知道可以使用简单的Bayws规则函数轻松计算出这个特定的答案。我想我所问的是,是否有更复杂的推理功能,而不必明确定义计算。例如,能够计算P(Cancer-|Test+,Test-,Test-)。其中Cancer + / - 的概率随着每个连续测试结果略微变化。 - Bart
也可能使用不同的发行版。 - Bart
是的,我知道概率函数,但我还没有能够算出如何使它执行上述计算。我可能漏掉了一些非常基本的东西。 - Bart
@Bart,Probability 函数对其他分布应该也是有用的,但在你所面临的两个事件中值本质上是布尔型时,我的函数更直接。使用我的函数可以方便地改变癌症的概率:只需更改第一个参数,例如 conditionalProb [0.03,0.9,0.2] - Verbeia

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