13

Mathematica は、手動で計算を行わなくても、ベイズ規則の条件付き確率計算を行うことができますか? もしそうなら、どのように?

Mathemtaica doco と Web の両方でヒントを探していますが、何も見つかりません。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 における記号的条件付き期待値

4

2 に答える 2

13

実際...私は過去にこれを象徴的に解決しました.それは多くの単純な(連鎖していない)確率をカバーしています. チェーンを追加するのはそれほど難しくないと思います(以下を参照)。追加で返信していただければ幸いです。シンボリック アプローチは、ベルヌーイ分布を操作してベイズ定理の proc を作成し、それを毎回適切に適用する方法を考えるよりもはるかに柔軟です。

注: 上記の記事のように((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[!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などを使用してチェーンルールをコーディングする人はいますか? 私のプロジェクトでは必要ありませんでしたが、誰かが必要としても、追加するのはそれほど難しくありません.

于 2011-12-04T20:23:47.223 に答える
5

PrintステートメントとBernoulliDistributionsで問題を複雑にするつもりはありません。確率はわかっているので、最も簡単な方法はそれらを直接計算することですが、おそらくベクトルを使用して を取得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 の確率機能を使用すると、条件付き確率を「自動的に」計算できますが、ベルヌーイ分布イベントに関するこのような問題の場合、やり過ぎです。

于 2011-10-25T11:26:11.780 に答える