PyMC3 中的分层多项式模型

问题描述

我想比较两组多项式 (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 的每个维度的后验均值的狄利克雷分布准确地居中:

enter image description here

第二组 (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);

再一次,后验分布、迹线和狄利克雷分布看起来不错:

enter image description here

我尝试使用通常在 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 个分歧,后验/踪迹是一团糟,狄利克雷分布相当缺乏信息:

enter image description here

我已经尝试增加对调整的接受要求(高达 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 (将#修改为@)