2015-12-08 305 views
0

我正在使用一个简单的双变量正态模型,其中有一些非常规的事例。我所面临的主要问题是,我的后辈从一次跑到下一次跑都不一致,我猜测这与连续样本之间高依赖性的问题有关。这是我的具体问题。如何使用pymc3独立采样

  1. 获得N个独立样本的最佳方法是什么?目前,我一直在调用sample()来获得一个大的链(例如长度为10,000),然后每1000个样本开始抽取一百个样本。但现在看看其中一个参数的自相关曲线,看起来我至少需要每取500个样本! (我也可以使用互信息来更好地了解滞后之间的依赖关系。)

  2. 我一直在遵循pymc3教程中stochastic volatility example中描述的拟合过程。特别是我首先找到MAP,然后用它来生成一个NUTS()对象,然后取一个简短的样本,然后用它来生成另一个NUTS()对象,使用gamma = 0.25(???),最后得到我的大样本。我不知道这是否合适,或者我是否需要gamma = 0.25。

  3. 另外,在同一个例子中,有指数分布的测试值。我不知道我是否需要这些。 (默认使用平均值有什么问题?)

这是我正在使用的实际模型。

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

我不确定你在做什么,你已经设置了复杂的先前结构,但我认为那里有问题。

我简化了模型:

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

其中有很大的收敛。我想你也可以放下gamma参数。