如何解决Theano张量长度未知,但可以在pymc3层次模型中添加
我正在尝试使用Spyder在Win10环境中使用pymc3运行分层模型。 我有一些全局模型参数(theta,omega,sigma)和一个特定参数(Ci)。
它将pd数据框作为包含相关数据的输入。第一列称为“同类群组”,第二列称为“时段”,第三列包含观察值。
代码如下:
import pymc3 as pm
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import theano.tensor as tt
cohorts_idx,cohorts = pd.factorize(inputs['Cohort'],sort = True)
periods_idx,periods = pd.factorize(inputs['Period'],sort = True)
coords = {
"cohort": cohorts,"period": periods,"collections": np.arange(len(cohorts_idx))
}
with pm.Model(coords = coords) as model:
# global model parameters
omega = pm.Halfnormal("omega",sigma = 3)
theta = pm.Halfnormal("theta",sigma = 5)
sigma = pm.Halfnormal("sigma",sigma = 20)
# cohort specific parameter
Ci = pm.Truncatednormal("Ci",mu = 60,sigma = 10,lower = 10,upper = 110,dims = "cohort")
mu_i_t = Ci[cohorts_idx] * (1 - tt.exp(- (periods[periods_idx] / theta) ** omega))
sigma_i_t = sigma * mu_i_t ** 0.5
_ = pm.normal("Collections_i_t",mu = mu_i_t,sigma = sigma_i_t,observed = inputs['Collections'],dims = "collections")
results = pm.sample(draws = 1000,tune = 1000,cores = 8)
return pm.summary(results)
产生的错误消息是:
mu_i_t = Ci[cohorts_idx] * (1 - tt.exp(- (periods[periods_idx] / theta) ** omega))
File "C:\Users\alexi\Anaconda3\lib\site-packages\pandas\core\indexes\base.py",line 139,in
index_arithmetic_method
result = op(Series(self),other)
File "C:\Users\alexi\Anaconda3\lib\site-packages\pandas\core\ops\common.py",line 64,in new_method
return method(self,other)
File "C:\Users\alexi\Anaconda3\lib\site-packages\pandas\core\ops\__init__.py",line 505,in wrapper
return _construct_result(left,result,index=left.index,name=res_name)
File "C:\Users\alexi\Anaconda3\lib\site-packages\pandas\core\ops\__init__.py",line 478,in _
construct_result
out = left._constructor(result,index=index)
File "C:\Users\alexi\Anaconda3\lib\site-packages\pandas\core\series.py",line 279,in __init__
data = com.maybe_iterable_to_list(data)
File "C:\Users\alexi\Anaconda3\lib\site-packages\pandas\core\common.py",line 280,in
maybe_iterable_to_list
return list(obj)
File "C:\Users\alexi\Anaconda3\lib\site-packages\theano\tensor\var.py",line 640,in __iter__
for i in xrange(theano.tensor.basic.get_vector_length(self)):
File "C:\Users\alexi\Anaconda3\lib\site-packages\theano\tensor\basic.py",line 4828,in
get_vector_length
raise ValueError("length not kNown: %s" % msg)
ValueError: length not kNown: Elemwise{true_div,no_inplace} [id A] ''
|TensorConstant{[ 1 2 3 .. 1 2 1]} [id B]
|InplaceDimshuffle{x} [id C] ''
|ViewOp [id D] 'theta'
|Elemwise{exp,no_inplace} [id E] ''
|theta_log__ [id F]
我不知道为什么。请注意,如果我不是在导致错误的行中除以Theta,而是进行加法运算,那么它将起作用(显然,这不是我想要的)。
我该如何解决并使该部门工作?
解决方法
好的,我发现了。我不足以解释原因,但以下方法可以解决。需要替换一行:
mu_i_t = Ci [cohorts_idx] *(1-tt.exp(-(periods [periods_idx] / theta)**Ω))
作者:
mu_i_t = Ci [cohorts_idx] *(1-tt.exp(-(periods [periods_idx] .to_numpy() / theta)**Ω))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。