如何使用pymc3独立采样

时间:2015-12-08 19:42:15

标签: pymc3

我正在使用一个简单的双变量正态模型,其中有一些非传统的先验。我的主要问题是我的后代在一次运行中是不一致的,我猜测这与连续样本之间的高依赖性问题有关。以下是我的具体问题。

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

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

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

  4. 以下是我使用的实际型号。

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

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

哪个收敛很大。我想你也可以放弃伽玛参数。