PYMC3:如何将math.switch用于高维随机变量

时间:2018-06-13 14:40:36

标签: python machine-learning statistics theano pymc3

我目前正在尝试使用本指南实施更改点检测: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语句只允许你在一维随机变量之间切换,我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:0)

我无权访问您的模型的其余部分,但是遇到了同样的问题,可以通过在切换期间选择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])