Bar*_*art 11 wolfram-mathematica mathematica-8
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
Run Code Online (Sandbox Code Playgroud)
是否有可能解决问题
P(Cancer+|Test+) = 0.0434
Run Code Online (Sandbox Code Playgroud)
所以使用下面的内容.
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-) = ?"];
Run Code Online (Sandbox Code Playgroud)
我可以通过手动定义所有概率表来计算出联合概率,但有没有办法让Mathematica完成繁重的工作?有没有办法定义和计算这些条件概率?
非常感谢任何帮助,即使它"你不能......停止尝试":)
PS:这是尝试沿着这些方向做某事吗? Mathematica中的符号条件期望
Gre*_*per 12
实际上......我过去曾以象征性的方式解决这个问题,它涵盖了许多简单(非链接)的概率.我想添加链接并不困难(见下文).欢迎您通过扩充回复.符号方法比使用伯努利分布更灵活,并为贝叶斯定理创建一个过程并思考每次应用它的正确方法.
注意:函数没有绑定,就像上面的帖子一样,((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];
Run Code Online (Sandbox Code Playgroud)
然后你可以这样使用它:
P[Cancer]=0.01;
Run Code Online (Sandbox Code Playgroud)
因为P[!Cancer]产量不需要"不是癌症" 0.99(Esc+not+Esc类型非常符合逻辑而不是符号,但是Not[A],!A或者也可以\[Not]A正常工作)
P[Test \[Conditioned] Cancer] = 0.9
P[Test \[Conditioned] ! Cancer] = 0.2
Run Code Online (Sandbox Code Playgroud)
再次:P[!Test \\[Conditioned] Cancer]将1-P[Test \\[Conditioned] Cancer]根据定义,除非你将其覆盖.
现在让我们查询这个模型:
P[Test, Cancer]
P[!Test, Cancer]
Run Code Online (Sandbox Code Playgroud)
回报
0.207
0.793
Run Code Online (Sandbox Code Playgroud)
和
P[Cancer \[Conditioned] Test]
P[!Cancer \[Conditioned] Test]
P[Cancer \[Conditioned] !Test]
P[!Cancer \[Conditioned] !Test]
Run Code Online (Sandbox Code Playgroud)
回报
0.0434783
0.956522
0.00126103
0.998739
Run Code Online (Sandbox Code Playgroud)
我想这是一个不错的主意P(B|A1,A2,A3,...,An),任何人都可以使用NestList或类似的东西来编码链规则?我并不需要它用于我的项目,但如果有人需要它,它就不会很难添加.
我不会将这个问题与Printstatement和BernoulliDistributions 复杂化。您知道这些概率,因此最简单的方法是直接计算它们,但也许使用向量get P(B),并利用pr(cancer)= 1-pr(not cancer)等事实,依此类推。
贝叶斯定理指出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
Run Code Online (Sandbox Code Playgroud)
是的,版本8中的概率功能确实允许您“自动”计算条件概率,但是对于像伯努利分布的事件这样的问题,它是过大的。