PyMC 中循环中的确定性节点

1 投票
1 回答
1095 浏览
提问于 2025-04-18 14:01

我刚开始学习Python和PyMC,进展还不错。不过我对如何设置一个二维矩阵的确定性值有点困惑。我有一个模型,但我无法正确解析它。问题出在模型中设置theta的值上。

import numpy as np
import pymc

定义已知变量

N = 2
T = 10
tau = 1

定义模型……我无法正确解析它。问题在于theta的分配上。我想要获取D和x的样本。Theta只是一个中间变量,但我需要保留它,因为它在模型的更复杂变体中会用到。

def NAFCgenerator():

    D = np.empty(T, dtype=object)
    theta = np.empty([N,T], dtype=object)
    x = np.empty([N,T], dtype=object)

    # true location of signal
    for t in range(T):
        D[t] = pymc.DiscreteUniform('D_%i' % t, lower=0, upper=N-1)

    for t in range(T):
        for n in range(N):
            @pymc.deterministic(plot=False)
            def temp_theta(dt=D[t], n=n):
                return dt==n
            theta[n,t] = temp_theta

            x[n,t] = pymc.Normal('x_%i,%i' % (n,t),
                               mu=theta[n,t], tau=tau)

    return locals()

** 编辑 **

对于我来说,明确的索引在学习PyMC和Python时很有用。但似乎提取MCMC样本有点麻烦,比如说:

D0values = pymc_generator.trace('D_0')[:]

但我可能漏掉了什么。不过我确实成功让一个向量化的版本运行起来了。

# Approach 1b - actually quite promising
def NAFCgenerator():

# NOTE TO SELF. It's important to declare these as objects
D = np.empty(T, dtype=object)
theta = np.empty([N,T], dtype=object)
x = np.empty([N,T], dtype=object)

# true location of signal
D = pymc.Categorical('D', spatial_prior, size=T)

# displayed stimuli
@pymc.deterministic(plot=False)
def theta(D=D):
    theta = np.zeros([N,T])
    theta[0,D==0]=1
    theta[1,D==1]=1
    return theta

#for n in range(N):    
x = pymc.Normal('x', mu=theta, tau=tau)

return locals()

用这个方法似乎更容易获取MCMC样本。

Dvalues = pymc_generator.trace('D')[:]

1 个回答

1

在PyMC2中,当你用装饰器创建确定性节点时,默认情况下节点的名字会取自函数的名字。解决这个问题很简单:只需要在装饰器中指定节点的名字作为一个参数。

        @pymc.deterministic(name='temp_theta_%d_%d'%(t,n), plot=False)
        def temp_theta(dt=D[t], n=n):
            return dt==n
        theta[n,t] = temp_theta

这里有一个笔记本,能让你更好地理解这个内容

撰写回答