首页 > 解决方案 > PYMC3:如何将 math.switch 用于高维随机变量

问题描述

我目前正在尝试使用本指南实现变更点检测:http: //nbviewer.jupyter.org/github/CamDavidsonPilon/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers/blob/master/Chapter1_Introduction/Ch1_Introduction_PyMC3.ipynb

它使用 switch 语句来决定变化点之前和之后的分布参数。

lambda_ = pm.math.switch(tau > idx, lambda_1, lambda_2)

我也试图找到一个变化点,但使用假定来自多元分布的数据。

这是我的代码:

tau = pm.Uniform("tau_", lower = x_data[0], upper = x_data[-1])
mus_1 = pm.Uniform("mus1", lower = min(y_data[0]), upper = max(y_data[0]), shape = 10)
mus_2 = pm.Uniform("mus2", lower = min(y_data[0]), upper = max(y_data[0]), shape = 10)
mus_ = pm.math.switch(tau > x_data, mus_1, mus_2)

我将形状设为 10,假设分布是具有 10 个变量的多元正态分布。

我假设 switch 语句会将形状 10 随机变量元素明智地分配给 x_data(7919 点)

但是,我收到以下错误:

ValueError: Input dimension mis-match. (input[0].shape[0] = 7919, input[1].shape[0] = 10)

似乎 switch 语句只允许您在一维随机变量之间切换,我该如何解决这个问题?

标签: pythonmachine-learningstatisticstheanopymc3

解决方案


我无权访问您的模型的其余部分,但我遇到了同样的问题,并且能够通过在切换功能期间选择mus1mus2索引来开发解决方法。所以假设你有一些索引数组idx,代码如下所示,

tau = pm.Uniform("tau_", lower = x_data[0], upper = x_data[-1])
mus_1 = pm.Uniform("mus1", lower = min(y_data[0]), upper = max(y_data[0]), shape = 10)
mus_2 = pm.Uniform("mus2", lower = min(y_data[0]), upper = max(y_data[0]), shape = 10)
mus_ = pm.math.switch(tau > x_data, mus_1[idx], mus_2[idx])

推荐阅读