Как вы работаете с условными вероятностями в Mathematica.Является ли это возможным? - PullRequest
10 голосов
/ 25 октября 2011

Может ли 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:Была ли это попытка сделать что-то подобное? Символическое условное ожидание в Mathematica

Ответы [ 2 ]

11 голосов
/ 05 декабря 2011

На самом деле ... Я работал над этим символически в прошлом, и это покрывает много простых (не связанных) вероятностей.Я думаю, добавить цепочку будет не так сложно (см. Ниже).Вы можете ответить с дополнением.Символический подход гораздо более гибкий, чем работа с дистрибутивами Бернулли и создание процедуры для теоремы Байеса и размышления о правильном способе ее применения каждый раз.

ПРИМЕЧАНИЕ. Функции не связаны, как в посте выше((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 или что-то вроде этого?Мне это не нужно для моего проекта, но добавить его будет не сложно, если кому-то это понадобится.

4 голосов
/ 25 октября 2011

Я бы не усложнял проблему с 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 позволяет вычислять условныевероятности "автоматически", но для такой проблемы с событиями, распределенными по Бернулли, это перебор.

...