我正在与pymc3进行贝叶斯推理,并且我已经建立了以下简单的层次模型(注意-从技术上讲,它还不是层次模型,因为当前只有一个参数向量,但这是一个最小的示例)失败,它将改变):
import import pandas as pd
import numpy as np
from scipy.stats import norm, lognorm, nbinom
from pymc3 import Uniform, Beta, Binomial, sample, Model, NUTS, NegativeBinomial, Normal, HalfStudentT, traceplot
with Model() as model:
s = 0.2
log_mean = Normal('log_means', mu=0, sd=s, shape=(scaled_counts.shape[0],1))
log_sd = 0.5
probs = norm.cdf(bounds[:,1], loc=log_mean, scale=log_sd) - norm.cdf(bounds[:,0], loc=log_mean, scale=log_sd)
expected_counts = bin_probs * scaled_inputs[:, np.newaxis]
counts = NegativeBinomial('counts', mu=expected_counts, alpha=np.array(scaled_counts.sum(axis=0)).reshape(1, 6), observed=scaled_counts, shape=(scaled_counts.shape[0],6))
with model:
trace=sample(2000, step=NUTS())
无论如何,问题出在probs =
行中。使用norm(bounds[:,1], loc=test_array, scale=0.5)
和scipy.stats
调用bounds[:,1].shape = (6,)
(来自test_array.shape = (19217,1)
)可以正常工作。应用广播规则,得到的数组输出为(19217,6)
。但是,当我用log_mean
代替test_array
时,出现了一个错误,提示ValueError: setting an array element with a sequence.
。这很奇怪,因为我可以使用print(log_mean.tag.test_value.shape)
验证log_mean.shape = (19217,1)
。
我想知道我在做什么错。它似乎不是固有的多维性的结果,因为我可以将shape参数替换为1并仍然得到错误的结果。与尝试将pymc3 RV传递到scipy函数有关吗?这是否意味着我必须使用pm.math
为普通RV实现cdf?谢谢!
使用导入内容编辑的05/03/19。