0

不确定我是在做一些愚蠢的事情还是 pymc3 有错误,但是尝试将 T 分布拟合到正常值我得到了自由度数(0.18 到 0.25,我期望值很高,至少 4-5)。当然,如果我尝试具有合理数量的自由度(例如 3 或 5)的 T 分布,我会得到同样的错误。

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']);

你能建议一些修复(改变先验,抽样方法)吗?

4

1 回答 1

1

为什么你会期望看到 df 大约 4-5?df->inf 的 AT 分布等于正态分布。当我运行您的模型并执行以下操作时:print trace['df'][10000:].mean()我得到1.19876070951e+13, 所以东西非常大。

您可能会看到不同的一个原因是,如果您尝试在联合空间中采样(这曾经是 pymc3 中的默认设置),Metropolis 采样器可能会失败。如果您最近没有从 master 更新 pymc3,请尝试再次更新并运行模型,因为Metropolis现在默认为非阻塞并分别对每个变量进行采样。

于 2014-10-23T12:56:14.343 回答