首页 > 解决方案 > 在类分布之间切换

问题描述

我试图通过将红外光谱视为峰值、变化的基线和残余噪声的总和来对红外光谱进行建模。峰形和基线模型最终会演变成一个更复杂的模型,但我想从简单开始,然后逐步建立复杂性。现在我有高斯峰值、恒定的 y 偏移和正态分布的噪声。根据光谱所属的类别,y 偏移量来自分布 A 或 B。目前我正在使用生成的数据,如下所示: A 类和 B 类的模拟光谱

我拥有的模型(用 PyMC3 编码)看起来像:

npeaks = 3
nclasses = 2
with pm.Model() as model:
    # priors
    amp = pm.Uniform('amp', 0, x_s.max(), shape=(nclasses,npeaks))
    mu = pm.Normal('mu', mu=np.linspace(x_val.min(), x_val.max(), npeaks), sd=50, 
               shape=(nclasses,npeaks), transform=pm.distributions.transforms.ordered)
    sigma = pm.HalfNormal('sigma', sd=100, shape=(nclasses,npeaks))
    a_ = [pm.Normal('a_%d' % i, mu=0, sd=10, shape=(len(x_s),1)) for i in range(nclasses)]

    # spectral lines (per class)
    y_ = [pm.Deterministic('y_%d' % i, (amp[i] * np.exp(-(x_val - mu[i])**2/(2 * sigma[i]**2))).sum(axis=1) 
                       + a_[i]) for i in range(nclasses)]

    # labels (observed from the data, 0 or 1)
    theta = pm.Beta('theta', 1., 1.)
    label = pm.Bernoulli('label', p=theta, observed=Y)

    # switch to spectrum class A/B depending on label
    y_obs = pm.math.switch(pm.math.eq(label, 1), y_[0], y_[1])

    sigma_e = pm.Gamma('sigma_e', alpha=1., beta=1.)
    epsilon = pm.HalfNormal('epsilon', sd=sigma_e)

    y_pred = pm.Normal('y_pred', mu=y_obs, sd=epsilon, observed=x_s)

因此,根据训练数据 (Y) 中的标签,模型切换到变量 y_0 或 y_1。

我对这个基本模型的问题是:

另请注意: 1. 类别数是已知且固定的(在我的情况下为 2 或 4 个) 2. 每个光谱我知道标签 Y(光谱属于哪个类别)

最后,目标是为 Y 和光谱观测值 (x_s) 引入共享变量,以便(在推理之后)我可以:

  1. 设置变量 Y=z 并从分布 z 中采样
  2. 设置一个(看不见的)光谱 x_s[a] 并从后验分布标签中采样,这样我就可以计算出光谱属于哪个类别。

一个理想的解决方案是这样的:

# labels (observed from the data, 0 or 1)
theta = pm.Beta('theta', 1., 1.)
label = pm.Bernoulli('label', p=theta, observed=Y)

sigma_e = pm.Gamma('sigma_e', alpha=1., beta=1.)
epsilon = pm.HalfNormal('epsilon', sd=sigma_e)

y_pred = pm.Normal('y_pred', mu=y_[label], sd=epsilon, observed=x_s) 

这样,无论标签代码是什么(在这种情况下为 [0|1],但对于 4 个类别为 [0|1|2|3]),都找到了正确的索引,但此解决方案给出了错误:

`TypeError: list indices must be integers or slices, not ObservedRV`

标签: pythontheanobayesianpymc3

解决方案


推荐阅读