gpt4 book ai didi

wolfram-mathematica - 您如何计算 Mathematica 中的条件概率。是否可以?

转载 作者:行者123 更新时间:2023-12-04 01:52:32 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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.99 ( Esc+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 或类似的东西对链式规则进行编码吗?我的项目不需要它,但如果有人需要它,添加它不会那么困难。

关于wolfram-mathematica - 您如何计算 Mathematica 中的条件概率。是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7887519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com