[英]Simple Hamiltonian Monte Carlo Example with TensorFlow Probability's Edward2
[英]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
當我在貝葉斯推理中得到不穩定的結果時(我使用 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.