问题描述
我想比较两组多项式 (k=3) 观测值的狄利克雷超参数。
我可以分开装两个,它们看起来都不错。
第一组 (N=10) 观测值是根据 [.30 .60 .10] 的 alpha 向量模拟的,计数在 50 左右变化
import numpy as np
import pymc3 as pm
import pandas as pd
import theano.tensor as tt
#model 1
N1=10;
c1 = np.asarray([[16,29,4],[16,6],[14,30,3],31,5],[13,[15,32,[17,4]]);
counts1 = np.asarray([49,51,48,52,47,50,54,46]);
with pm.Model() as model1:
hyper_param1 = pm.Halfnormal('hyper_param1',10,shape=3);
param1 = pm.Dirichlet('param1',a=hyper_param1,shape=(N1,3));
y1 = pm.Multinomial('y1',n=counts1,p=param1,observed=c1);
trace1 = pm.sample(10000,tune=10000,init='adapt_diag',target_accept=0.95);
后验和迹线看起来不错,而且使用 hyper_param1 的每个维度的后验均值的狄利克雷分布准确地居中:
第二组 (N=11) 观测值是根据 [.30 .10 .60] 的 alpha 向量模拟的,计数再次在 50 左右变化:
#model 2
N2 = 11;
c2 = np.asarray([[15,4,31],3,30],5,6,29],7,29]]);
counts2 = np.asarray([50,53,49,51]);
with pm.Model() as model2:
hyper_param2 = pm.Halfnormal('hyper_param2',shape=3);
param2 = pm.Dirichlet('param2',a=hyper_param2,shape=(N2,3));
y2 = pm.Multinomial('y2',n=counts2,p=param2,observed=c2);
trace2 = pm.sample(10000,target_accept=0.95);
我尝试使用通常在 PyMC3 中使用的索引格式将这些组合成一个分层模型:
## Combined model
c_comb = np.asarray([[16,29]]);
counts_comb = np.asarray([49,46,51]);
idx = np.asarray([0,1,1]).astype(int);
with pm.Model() as model_comb:
hyper_param_comb1 = pm.Halfnormal('hyper_param_comb1',shape=3);
hyper_param_comb2 = pm.Halfnormal('hyper_param_comb2',shape=3);
param_comb1 = pm.Dirichlet('param_comb1',a=hyper_param_comb1,3));
param_comb2 = pm.Dirichlet('param_comb2',a=hyper_param_comb2,3));
param_comb = tt.concatenate((param_comb1,param_comb2),axis=0);
y_comb = pm.Multinomial('y_comb',n=counts_comb,p=param_comb[idx],observed=c_comb);
trace_comb = pm.sample(10000,target_accept=0.95);
模型勉强适合。 > 100 个分歧,后验/踪迹是一团糟,狄利克雷分布相当缺乏信息:
我已经尝试增加对调整的接受要求(高达 0.99),增加调整样本,hyper_params(gamma,Students,normal)上的各种先验,还尝试拟合参数向量的指数以防万一负值不知何故出现并造成混乱......没有任何效果。要么我对模型设置做了一些愚蠢的事情,或者这可能是一些需要解决的偏心/定心问题?
PyMC3 版本:3.8 Python版本:3.8 操作系统:Linux (PopOS v20.10) IDE: Spyder v4.2.1
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)