微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Theano张量长度未知,但可以在pymc3层次模型中添加

如何解决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 举报,一经查实,本站将立刻删除。