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