БЛОГ Язык результатов незначительным - PullRequest
2 голосов
/ 18 марта 2019

Я пробую язык байесовской логики , используя следующий пример .

  • * 1% женщин имеют рак молочной железы (и, следовательно, 99%не).
  • 80% маммограмм обнаруживают рак молочной железы, когда он там (и, следовательно, 20% пропускают его).
  • 9,6% маммограмм обнаруживают рак молочной железы, когда его нет (и поэтому90,4% правильно возвращают отрицательный результат).

Я создал следующий код:

random Boolean Has_Cancer ~ BooleanDistrib(0.01);
random Boolean Detect_Cancer ~ 
    if Has_Cancer then BooleanDistrib(0.8)
    else BooleanDistrib(0.096);

obs Detect_Cancer = true;

query Has_Cancer;

При запуске я получаю следующие результаты:

======== Query Results =========
Number of samples: 10000
Distribution of values for Has_Cancer
    false   0.9245347606896278
    true    0.07546523931038764
======== Done ========

По данным блога true должно быть 0.0776.

Когда я запускаю 100 образцов, я получаю это:

======== Query Results =========
Number of samples: 100
Distribution of values for Has_Cancer
    false   0.9223602484472041
    true    0.077639751552795
======== Done ========

Я просто пытаюсь понять, почему.

1 Ответ

1 голос
/ 22 марта 2019

Значения, которые генерирует BLOG, представляют собой точечные оценки после генерации случайных выборок из условной вероятностной графической модели с использованием алгоритма взвешивания правдоподобия (LWA). Отличия от аналитических значений в примере поста, вероятно, связаны с шумом от процесса случайной выборки.

Что может сбивать с толку, так это то, что BLOG по умолчанию инициализирует генератор случайных чисел с тем же фиксированным начальным числом, и поэтому результаты могут показаться обманчивыми, как будто они детерминированы. Если вы добавите флаг --randomize в вызов run, вы увидите результаты использования других случайных начальных чисел.

Я не знаю теоретических свойств LWA (например, насколько сильно он ограничивает задние средние значения), но, по крайней мере, для наивной схемы генеративной выборки, средства, которые вы генерируете, находятся в пределах 95% ДИ. Вот пример Python, имитирующий 1000 прогонов 10K выборок.

import numpy as np
from scipy.stats import binom

np.random.seed(2019)

N, K = 10000, 1000
tp = np.empty(K)

for i in range(K):
    t = binom(n=N, p=0.01).rvs()
    f = N - t
    detect_t = binom(n=t, p=0.800).rvs()
    detect_f = binom(n=f, p=0.096).rvs()
    tp[i] = detect_t / (detect_f + detect_t)

np.quantile(tp, [0.025, 0.5, 0.975])
# array([0.06177242, 0.07714902, 0.09462359])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...