【问题标题】:How do you work out Conditional Probabilities in Mathematica. Is it possible?您如何计算 Mathematica 中的条件概率。是否可以?
【发布时间】:2011-10-25 09:54:11
【问题描述】:

Mathematica 可以在不手动进行计算的情况下进行贝叶斯规则条件概率计算吗?如果有怎么办?

我一直在搜索 Mathemtaica doco 和网络以寻找提示,但找不到任何东西。我不关心如何通过 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:这是在尝试按照这些思路做事吗? Symbolic Conditional Expectation in Mathematica

【问题讨论】:

    标签: wolfram-mathematica mathematica-8


    【解决方案1】:

    实际上...我在过去象征性地解决了这个问题,它涵盖了很多简单的(未链接的)概率。我想添加链接并不难(见下文)。欢迎您以增强的方式回复。符号方法比使用伯努利分布、为贝叶斯定理创建过程并每次都考虑应用它的正确方法要灵活得多。

    注意:函数没有绑定,就像上面的帖子 ((0 < pC < 1) && (0 < pTC < 1) && (0 < pTNC < 1)) 因为有时你想要“未加权”的结果,这会产生 0-1 范围之外的数字,那么你可以通过除以一些来回到范围内归一化概率或概率乘积。如果您确实想为错误检查添加界限,请执行以下操作:
    P[A_ /;0<=A<=1] := some_function_of_A;

    使用 Esc+cond+Esc 在 Mathematica 中输入 \\[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[!Test \\[Conditioned] Cancer] 根据定义将是 1-P[Test \\[Conditioned] Cancer],除非您覆盖它。

    现在让我们查询这个模型:

    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
    • 如果我应该记住你的名字,我深表歉意。如果您找到旧帐户,您应该能够通过标记您的一个帖子以引起钻石版主注意并请求它来合并帐户。
    • 是 Gr3gK1 stackoverflow.com/users/959803/gr3gk1 看看你能不能做点什么,我真的很感激!
    • Gregory,我相信你可以自己做,除非新用户的权限发生了变化。您应该在上面的帖子下方看到一个灰色链接,上面写着“标志”——单击它,然后选择“它需要 ♦ 版主注意”,然后选择“其他”。在该框中,请求合并帐户并如上所述包括“users/959803/gr3gk1”。如果您有麻烦,我会为您做这件事,但由您来做更有意义。
    • 已请求!谢谢你的帮助!你是这个网站的真正资产!
    【解决方案2】:

    我不会用Print 语句和BernoulliDistributions 使问题复杂化。你知道概率,所以最简单的做法是直接计算它们,但也许使用向量得到P(B),并使用 pr(cancer) = 1-pr(notcancer) 等事实。

    贝叶斯定理指出 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 版中的 Probability 功能确实允许您“自动”计算条件概率,但对于像伯努利分布事件这样的问题,它是矫枉过正的。

    【讨论】:

    • 谢谢,打印只是希望在 mma 中执行时更清楚地了解我想要实现的目标,也许它适得其反。作为我知道的答案,我可以使用简单的 Bayws 规则函数轻松得出这个特定答案。我想我要问的是 mma 是否有能力进行更复杂的推理,而无需明确定义计算。例如,能够计算出 P(Cancer-|Test+, Test-, Test-)。癌症 +/- 的概率随着每个连续的测试结果而略有变化。
    • 也可能使用不同的分布。
    • 是的,我知道概率函数,但无法弄清楚如何让它进行上述计算。我可能遗漏了一些非常基本的东西。
    • @Bart,Probability 函数应该为其他分布执行您想要的操作,但是对于您有两个事件本质上为布尔值的情况,我的函数中更直接的方法更清晰.改变癌症的概率与我的功能很好:只需改变第一个参数,例如conditionalProb[0.03,0.9,0.2].
    猜你喜欢
    • 2017-12-07
    • 2016-04-12
    • 2022-11-14
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    相关资源
    最近更新 更多