我一直在努力研究如何根据PYMC3中的Kim, Ghahramani (2012)定义贝叶斯分类器组合的模型(参见下面的有向图模型(本文图1))
Directed Graphical Model image
我们的想法是,对于每个k分类器混淆矩阵pi_k,你有一个指数先验参数alpha_k,它们是从Dirichlet中采样的。
类似地,对于从Multinomial生成的生成的目标t_i值,我们有一个Dirichlet先验。然后,调整t_i的值,我们从Multinomial中对分类器输出c_i进行采样。
不幸的是,考虑到目标t的值,我无法弄清楚如何索引混淆矩阵pi。 (我使用了分类分布而不是Multinomial)。变量c_train是长度为k = 4个numpy形状阵列(I = 100,)的列表,对应于来自分类器的分类。
I = 100 # number of instances
J = 3 # number of classes
K = 4 # number of classifiers
nu_vec = np.array([1. for _ in range(J)], dtype=np.float32)
lambda_mat = np.array([[.01, .02, .03], [.04, .05, .06], [.07, .08, .09]], dtype=np.float32)
with pm.Model() as model:
p_vec = pm.Dirichlet(name='p_vec', a=nu_vec)
t = pm.Categorical(name='t', p=p_vec, shape=I)
alpha = [pm.Exponential('alpha_{}'.format(k), lam=lambda_mat, shape=(J, J)) for k in range(K)]
pi = [[pm.Dirichlet('pi_j{}k{}'.format(j, k), alpha[k][j], shape=(3)) for j in range(J)] for k in range(K)]
c = [[] for k in range(K)]
for i in range(I):
for k in range(K):
c[k].append(pm.Categorical('c_k{}i{}', p=pi[k][t[i]], observed=c_train[k][t[i]]))
上面的代码返回一个TypeError:list索引必须是整数或切片,而不是FreeRV。非常感谢任何建议或帮助!