我对Python和PyMC有点新,并且取得了快速进展。但我只是对使用设置2D矩阵的确定性值感到困惑。我有一个模型,我无法正确解析。问题与在模型中设置值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')[:]
答案 0 :(得分: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