不确定我是在做傻事还是pymc3有一个bug,但是试图将T分布变为正常我得到自由度的数量(0.18到0.25,我期待一些高,4-5 at at最小)。当然,如果我尝试具有合理自由度的T分布,例如3或5,我会得到相同的错误。
import pymc3 as pm
Nsample = 200000
tst = np.random.normal(loc = 1e4, scale = 5e4, size = 250)
with pm.Model() as m:
mean = pm.Normal('mean',mu=0,sd = 1e5)
sigma = pm.Flat('sigma') # I tried uniform, gamma, exponential
df = pm.Flat("df") # the same
v = pm.T("pl",nu=df,mu = mean, lam = 1.0/sigma, observed = tst)
start = {'df':5,'mean': 1e4, 'sigma':5e4} #start = pm.find_MAP()
step = pm.Metropolis()
trace = pm.sample(Nsample, step,start=start, progressbar=True)
pm.traceplot(trace[100000:],vars = ['df', 'sigma', 'mean']);
你能建议一些修正(改变先验,采样方法)吗?
答案 0 :(得分:1)
为什么你会看到大约4-5的df?具有df-> inf的T分布等于正态分布。当我运行你的模型时:print trace['df'][10000:].mean()
我得到1.19876070951e+13
,所以非常大。
您可能会看到不同之处的一个原因是,如果您尝试在关节空间(曾经是pymc3中的默认值)中进行采样,Metropolis采样器可能会失败。如果您最近没有从master更新pymc3,请尝试再次更新并运行模型,因为Metropolis
现在默认为非阻塞,并分别对每个变量进行采样。