我正在使用一个简单的双变量正态模型,其中有一些非传统的先验。我的主要问题是我的后代在一次运行中是不一致的,我猜测这与连续样本之间的高依赖性问题有关。以下是我的具体问题。
获得N个独立样本的最佳方法是什么?目前,我一直在调用sample()来获得一个大链(例如长度为10,000),然后从1,000开始每100个样本。但现在看一下其中一个参数的自相关曲线,看起来我需要至少每500个样本采取一次! (我也可以使用互信息来更好地了解滞后之间的依赖关系。)
我一直在遵循pymc3教程中stochastic volatility example中描述的拟合程序。特别是我首先找到MAP,然后用它来生成一个NUTS()对象,然后取一个简短的样本,然后使用它生成另一个NUTS()对象,使用gamma = 0.25(???),然后最终得到我的大样本。我不知道这是否合适,或者我是否需要gamma = 0.25。
此外,在同一个示例中,还有指数分布的测试。我不知道我是否需要这些。 (默认使用均值有什么问题?)
以下是我使用的实际型号。
import pymc3 as pymc
import numpy as np
import theano.tensor as th
from pymc3.distributions.continuous import Gamma, Uniform, Normal, Bounded
from pymc3.distributions.multivariate import MvNormal
from pymc3.model import Deterministic
data = np.random.randn(3000, 2) / 300 # I have actual data!
with pymc.Model():
tau = Gamma('tau', alpha=2, beta=1 / 20000)
sigma = Deterministic('sigma', 1 / th.sqrt(tau))
corr = Uniform('corr', lower=0, upper=1)
alpha_sig = Deterministic('alpha_sig', sigma / 50)
alpha_post = Normal('alpha_post', mu=0, sd=alpha_sig)
alpha_pre = Bounded(
'alpha_pre', Normal, alpha_post, np.Inf, mu=0, sd=alpha_sig)
corr_inv = th.stack([th.stack([1, -corr]),
th.stack([-corr, 1])]) / (1 - th.sqr(corr))
MvNormal(
'data', mu=th.stack([alpha_post, alpha_pre]),
tau=tau * corr_inv, observed=data)
map_ = pymc.find_MAP()
step1 = pymc.NUTS(scaling=map_)
trace1 = pymc.sample(1000, step=step1)
step2 = pymc.NUTS(scaling=trace1[-1], gamma=0.25)
trace2 = pymc.sample(10000, step=step2, start=trace1[-1])
答案 0 :(得分:0)
我不确定您在设置的复杂先前结构方面做了什么,但我认为那里存在问题。
我将模型简化为:
import pymc3 as pymc
import numpy as np
import theano.tensor as th
from pymc3.distributions.continuous import Gamma, Uniform, Normal, Bounded
from pymc3.distributions.multivariate import MvNormal
from pymc3.model import Deterministic
data = np.random.randn(3000, 2) # I have actual data!
with pymc.Model():
corr = Uniform('corr', lower=0, upper=1)
corr_inv = th.stack([th.stack([1, -corr]),
th.stack([-corr, 1])]) / (1 - th.sqr(corr))
mu = Normal('mu', mu=0, sd=1, shape=2)
MvNormal('data',
mu=mu,
tau=corr_inv,
observed=data)
map_ = pymc.find_MAP()
step1 = pymc.NUTS(scaling=map_)
trace1 = pymc.sample(1000, step=step1)
step2 = pymc.NUTS(scaling=trace1[-1])
trace2 = pymc.sample(10000, step=step2, start=trace1[-1])
哪个收敛很大。我想你也可以放弃伽玛参数。