python - 在类分布之间切换
问题描述
我试图通过将红外光谱视为峰值、变化的基线和残余噪声的总和来对红外光谱进行建模。峰形和基线模型最终会演变成一个更复杂的模型,但我想从简单开始,然后逐步建立复杂性。现在我有高斯峰值、恒定的 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。
我对这个基本模型的问题是:
- 我现在在 2 个类之间切换,但也想在 4 个类或 N 类之间切换。通常我会使用类似 switch case 语句的东西,但这不可用。在当前情况下如何实现这一目标?
另请注意: 1. 类别数是已知且固定的(在我的情况下为 2 或 4 个) 2. 每个光谱我知道标签 Y(光谱属于哪个类别)
最后,目标是为 Y 和光谱观测值 (x_s) 引入共享变量,以便(在推理之后)我可以:
- 设置变量 Y=z 并从分布 z 中采样
- 设置一个(看不见的)光谱 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`
解决方案
推荐阅读
- c - C 中的中间人使用 ping 回显请求进行攻击
- javascript - undefined 不是反应原生的对象(评估'course.id')
- python - 对模型排序后更新 QListView 选择
- ios - JSON,可编码,图像,试图通过将图像转换为base64来编码包含图像的结构数组
- windows-10 - Pytest 测试项目的 src 部分中是否存在文件
- python - 使用 python urllib 下载工作日 RAAS 报告
- node.js - multer.single 不上传 inout 文件到 req
- css - 解决字段分成两部分的问题,一为图标,一为书写
- python - 动态属性传递
- amazon-web-services - AWS Step Functions - 包括所有步骤输入,但添加一个参数