Пример апостериорного вероятностного питона - PullRequest
0 голосов
/ 31 августа 2018

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

Мой предыдущий: неинформативный (равномерное распределение)

Генеративная модель: случайное угадывание да / нет, реализованное с использованием двоичного биномиального распределения

Вот код:

import numpy as np
import pandas as pd

def pprob():
    pass

def generative_model(n_events, p):
    return np.random.binomial(n_events, p)

def ABC(n_occured, n_events, n_draws=100000):
    prior = pd.Series(np.random.uniform(0, 1, size=n_draws))
    sim_data = [generative_model(n_events, p) for p in prior]
    posterior = prior[list(map(lambda x: x == n_occured, sim_data))]
    posterior_probability = pprob()

ABC(10, 16)

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Я добавил несколько исправлений, чтобы они работали в первый раз:

import math
from scipy import stats
from scipy.special import factorial
from matplotlib import pyplot as plt
import pandas as pd
import numpy as np

def likelihood(theta, n, x):
    return (factorial(n) / (factorial(x) * factorial(n - x))) * (theta ** x) * ((1 - theta) ** (n - x))

def pprob(prior, posterior, n_occured, n_events):
    return pd.Series(map(lambda theta: likelihood(theta, n_events, n_occured), prior))

def generative_model(n_events, p):
    return np.random.binomial(n_events, p)

def ABC(n_occured, n_events, n_draws=1000):
    prior = pd.Series(sorted(np.random.uniform(0, 1, size=n_draws)))
    sim_data = [generative_model(n_events ,p) for p in prior]
    posterior = prior[list(map(lambda x: x == n_occured, sim_data))]
    posterior_probability = pprob(prior, posterior, n_occured, n_events)

    # let's see what we got
    f, ax = plt.subplots(1)
    ax.plot(prior, posterior_probability)
    ax.set_xlabel("Theta")
    ax.set_ylabel("Likelihood")
    ax.grid()
    ax.set_title("Likelihood of Theta for New Campaign")
    plt.show()

ABC(10, 16)
0 голосов
/ 31 августа 2018

спасибо: этот сайт

полный код моего решения:

import math
from scipy import stats
from scipy.special import factorial
from matplotlib import pyplot as plt

def likelihood(theta, n, x):
    return (factorial(n) / (factorial(x) * factorial(n - x))) * (theta  x) * ((1 - theta)  (n - x))

def pprob(prior, posterior, n_occured, n_events):
    return pd.Series(map(lambda theta: likelihood(theta, n_events, n_occured), prior))

def generative_model(n_events, p):
    return np.random.binomial(n_events, p)

def ABC(n_occured, n_events, n_draws=1000):
    prior = pd.Series(sorted(np.random.uniform(0, 1, size=n_draws)))
    sim_data = [generative_model(n_events ,p) for p in prior]
    posterior = prior[list(map(lambda x: x == n_occured, sim_data))]
    posterior_probability = pprob(prior, posterior, n_occured, n_events)

    # let's see what we got
    f, ax = plt.subplots(1)
    ax.plot(prior, posterior_probability)
    ax.set_xlabel("Theta")
    ax.set_ylabel("Likelihood")
    ax.grid()
    ax.set_title("Likelihood of Theta for New Campaign")
    plt.show()

ABC(10, 16)

дает мне такую ​​милую вероятность:

[a]

...