首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >后验概率python示例

后验概率python示例
EN

Stack Overflow用户
提问于 2018-08-31 23:20:48
回答 2查看 9.7K关注 0票数 1

我一直在构建一个简单的近似贝叶斯计算应用程序,但遇到了一个问题。我不知道如何正确地实现posterior probability

我的前科:非信息性(均匀分布)

生成模型:使用numpy二项分布实现随机是/否猜测

代码如下:

代码语言:javascript
复制
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)

提前感谢!

EN

回答 2

Stack Overflow用户

发布于 2018-09-01 00:22:24

谢谢:this site

我的解决方案的完整代码是:

代码语言:javascript
复制
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)

给我带来了这个可爱的可能性:

]

票数 1
EN

Stack Overflow用户

发布于 2019-06-07 07:05:29

我添加了一些更正,这样它第一次就可以工作了:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52118510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档