是否有一种解决方法可以将观察到的数据融合到Pymc3中的模型定义中?

时间:2015-05-28 03:56:26

标签: theano pymc3

问题定义:考虑“最简单”模型(来自pymc3示例),类似于以下内容:

model = Model()

data = np.random.normal(size=(2, 20))

with model:
    x = Normal('x', mu=.5, tau=2. ** -2, shape=(2, 1))

    z = Beta('z', alpha=10, beta=5.5)

    d = Normal('data', mu=x, tau=.75 ** -2, observed=data)

    step = NUTS()

    trace = sample(1000, step)

我想改变它,以便我有一个固定的模型结构,但运行几次迭代的采样,每次向前一个(观察的)数据集添加一个新的数据点。由于观察到的数据以某种方式嵌入到模型定义中,因此我知道这样做的唯一方法是将整个模型定义放在循环中:

model = Model()

# a set of initial data points
data = getInitPoints((2,5))

for i in xrange(m):
    with model:
        x = Normal('x', mu=.5, tau=2. ** -2, shape=(2, 1))

        z = Beta('z', alpha=10, beta=5.5)

        d = Normal('data', mu=x, tau=.75 ** -2, observed=data)

        step = NUTS()

        trace = sample(1000, step)
    data = numpy.vstack( (data,getnewPoint( (2,1) ) ) )
    #use the samples

如果模型很大,这可能会产生一些不必要的开销。为了避免重复定义相同模型的开销,我想知道是否有一个解决方案,以便通过类似于以下想法的方式实现相同的结果:

with model:
    x = Normal('x', mu=.5, tau=2. ** -2, shape=(2, 1))

    z = Beta('z', alpha=10, beta=5.5)

data = getInitPoints()

for i in xrange(m):
    # only necessary parts are included in the loop 
    with model:
        d = Normal('data', mu=x, tau=.75 ** -2, observed=data)
                    step = NUTS()
        trace = sample(1000, step)
     data = numpy.vstack((data,getnewPoint()))

甚至更好:

data = getInitPoints()
dataHandle = magicHandle(data)
with model:
    x = Normal('x', mu=.5, tau=2. ** -2, shape=(2, 1))

    z = Beta('z', alpha=10, beta=5.5)
    #
    d = Normal('data', mu=x, tau=.75 ** -2, observed=dataHandle)

    step = NUTS()

for i in xrange(m):
    with model:
        trace = sample(1000, step)
    #  
    dataHandle = numpy.vstack((data,getnewPoint()))

1 个答案:

答案 0 :(得分:0)

似乎不可能知道。但是这个主题有一个悬而未决的问题,可能有解决方案:https://github.com/pymc-devs/pymc/issues/10