Python 多维PyMC3观测

Python 多维PyMC3观测,python,bayesian,pymc3,imputation,Python,Bayesian,Pymc3,Imputation,我的模型有一个对数正态RV,C,形状(W,D)。W中的每一行和D中的每一列都有一个正在拟合的参数。我试图将我的观察结果指定为(W,D)矩阵,但是,这会导致theano编译错误 引发异常('编译失败(返回状态=%s):%s'% 异常:(“编译节点时发生以下错误”,Alloc(Elemwise{switch,no_inplace}.0,TensorConstant{10},TensorConstant{10}),“\n”,“编译失败(返回状态=3):”,“[Alloc(,TensorConstant

我的模型有一个对数正态RV,C,形状(W,D)。W中的每一行和D中的每一列都有一个正在拟合的参数。我试图将我的观察结果指定为(W,D)矩阵,但是,这会导致theano编译错误

引发异常('编译失败(返回状态=%s):%s'%
异常:(“编译节点时发生以下错误”,Alloc(Elemwise{switch,no_inplace}.0,TensorConstant{10},TensorConstant{10}),“\n”,“编译失败(返回状态=3):”,“[Alloc(,TensorConstant{10},TensorConstant{10})]”
我使用的模型来自答案。模型和观测数据如下:

logloss=np.数组([[6.85856503,6.35784227,7.15773548,6.7262334,4.34380542,
4.68213123, 4.20469262, 2.07944154, 1.38629436, 0.        ],
[6.74405919, 6.57228254, 6.45833828, 5.43807931, 3.58351894,
2.94443898,3.25809654,2.56494936,1.60943791,nan],
[6.89060912, 7.11314211, 6.42810527, 6.90975328, 5.33271879,
3.25809654,3.61091791,3.97029191,南,南],
[7.41276402, 6.93537045, 6.18208491, 6.06610809, 5.70378247,
6.04025471,2.48490665,楠,楠,楠],
[6.83733281, 6.91572345, 6.53087763, 6.55961524, 3.58351894,
4.81218436,楠,楠,楠,楠],
[7.05789794, 7.12286666, 5.98393628, 5.28320373, 3.63758616,
楠,楠,楠,楠,楠],,
[7.2984451,7.31455283,6.8721281,6.64509097,nan,
楠,楠,楠,楠,楠],,
[7.12286666,6.73340189,6.26720055,南,南,
楠,楠,楠,楠,楠],,
[7.18992217,6.9902565,楠,楠,楠,
楠,楠,楠,楠,楠],,
[7.25347038,楠,楠,楠,
楠,楠,楠,楠,楠]]
logprem=np.数组([8.66768002,8.49862181,8.60410456,8.54966038,8.55910259,
8.56216656, 8.51559191, 8.60630237, 8.56140145, 8.50956416])
D=10
W=10
logprem=tt.\u共享(logprem).T.重复(D,轴=1))
使用pm.Model()作为模型:
logelr=pm.Normal('logelr',-0.4,np.sqrt(10))
#列向量
alpha=pm.Normal(“alpha”,0,sigma=np.sqrt(10),形状=(W-1,1))
#行向量
β=pm.Normal(“β”,0,sigma=np.sqrt(10),形状=(1,D-1))
#预加零并广播到(W,D)
alpha_aug=tt.连接([tt.零((1,1)),alpha],轴=0.重复(D,轴=1)
#附加零并广播到(W,D)
beta_aug=tt.连接([beta,tt.零((1,1))],轴=1.重复(W,轴=0)
#从技术上讲,这些指数将被逆转
#例如,这里的a[0],a[9]分别对应于本文中的a_10,a_1。
a=pm.均匀('a',0,1,形状=D)
#注意:[::-1]按指定的顺序对其进行排序
#这样(sigma\u 0>sigma\u 1>…)
sigma=pm.Deterministic('sigma',tt.extra_ops.cumsum(a)[::-1]。重塑((1,D)))
#现在这里的一切都有形状(W,D)或者是标量(logelr)
mu=logprem+logelr+alpha_-aug+beta_-aug
#西格玛将自动广播
C=pm.Lognormal('C',mu=mu,sigma=sigma,shape=(W,D),观测值=logloss)

nan家怎么了?矩阵真的只有一个(部分)观测值吗?如果你指出这个模型的来源可能会有所帮助。当然,这是一个精算索赔准备金的模型。每一行都是事故年,每一列都是开发年龄。最近的事故年只有一个发展期,第二个最近的事故年有两个发展期,以此类推。目标是通过填充南部来“摆正三角形”。描述模型的论文,特别是论文第5节,交叉分类模型。直接问题可以通过将
logloss
转换为张量来解决,可以使用
tt.\u shared
或将其移动到模型上下文下并使用
pm.Data()
。然而,更大的问题是,观察变量仅评估可能性,因此,如果您想要插补
C
,则需要在不进行观察的情况下对其进行采样,并单独评估实际观察值的可能性。此外,PyMC3不处理nan的-不确定最好的解决方法。