繁体   English   中英

在 edward2 和 tensorflow2 中用 beta 先验预测二项式的 p

[英]predicting p of binomial with beta prior in edward2 & tensorflow2

以下代码通过使用 beta 作为先验来预测二项式分布的 p。 不知何故,有时,我得到了毫无意义的结果(接受率 = 0)。 当我用 pymc3 编写相同的逻辑时,我没有问题。 我看不到我在这里缺少什么。

import numpy as np
import tensorflow as tf
import tensorflow_probability as tfp
import edward2 as ed
from pymc3.stats import hpd
import numpy as np
import seaborn
import matplotlib.pyplot as plt

p_true = .15

N = [10, 100, 1000]
successN = np.random.binomial(p=p_true, n=N)
print(N)
print(successN)


def beta_binomial(N):
    p = ed.Beta(
        concentration1=tf.ones( len(N) ),
        concentration0=tf.ones( len(N) ),
        name='p'
    )
    return ed.Binomial(total_count=N, probs=p, name='obs')

log_joint = ed.make_log_joint_fn(beta_binomial)

def target_log_prob_fn(p):
    return log_joint(N=N, p=p, obs=successN)

#kernel = tfp.mcmc.HamiltonianMonteCarlo(
#    target_log_prob_fn=target_log_prob_fn,
#    step_size=0.01,
#    num_leapfrog_steps=5)
kernel = tfp.mcmc.NoUTurnSampler(
    target_log_prob_fn=target_log_prob_fn,
    step_size=.01
    )
trace, kernel_results = tfp.mcmc.sample_chain(
    num_results=1000,
    kernel=kernel,
    num_burnin_steps=500,
    current_state=[
        tf.random.uniform(( len(N) ,))
    ],
    trace_fn=(lambda current_state, kernel_results: kernel_results),
    return_final_kernel_results=False)

p, = trace
p = p.numpy()
print(p.shape)
print('acceptance rate ', np.mean(kernel_results.is_accepted))
def printSummary(name, v):
    print(name, v.shape)
    print(np.mean(v, axis=0))
    print(hpd(v))

printSummary('p', p)
for data in p.T:
    print(data.shape)
    seaborn.distplot(data, kde=False)

plt.savefig('p.png')

图书馆:

pip install -U pip
pip install -e git+https://github.com/google/edward2.git@4a8ed9f5b1dac0190867c48e816168f9f28b5129#egg=edward2
pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-2.0.0-cp37-cp37m-manylinux2010_x86_64.whl#egg=tensorflow
pip install tensorflow-probability

有时我会看到以下内容(当接受率=0 时): 接受率=0时的p分布

而且,有时我会看到以下内容(当接受率>.9 时): 接受率>.9时的p分布

当我在贝叶斯推理中得到不稳定的结果时(我使用 mc-stan,但它也使用 NUTS),通常是因为先验和似然指定错误,或者超参数对问题不利。

第一张图显示采样器从未偏离对答案的初始猜测(因此接受率为 0)。 我也担心绿色分布似乎在 0 上是正确的。 beta(1,1) 在 0 处有正概率,但 ap=0 在这里可能是一个不稳定的解决方案? (例如,采样器可能无法在该点计算导数并返回 NaN,因此不知道下一步在哪里采样?完全猜测)。

您能否将初始条件强制为 0 并查看是否总是会导致采样失败?

除此之外,我会尝试调整超参数,例如步长、迭代次数等......

此外,您可能希望仅使用一个 N 来简化示例。可能会帮助您进行诊断。 祝你好运!

random.uniform的 maxval 默认值为 None。 我把它改成1,结果就稳定了。

random.uniform(( len(N) ,), minval=0, maxval=1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM