Я работаю с pymc3 для выполнения байесовского вывода, и я установил следующую простую иерархическую модель (примечание - технически это еще не иерархическая модель, поскольку в настоящее время существует только один вектор параметров, но это минимальный пример того, чтосбой, и он изменится):
import import pandas as pd
import numpy as np
from scipy.stats import norm, lognorm, nbinom
from pymc3 import Uniform, Beta, Binomial, sample, Model, NUTS, NegativeBinomial, Normal, HalfStudentT, traceplot
with Model() as model:
s = 0.2
log_mean = Normal('log_means', mu=0, sd=s, shape=(scaled_counts.shape[0],1))
log_sd = 0.5
probs = norm.cdf(bounds[:,1], loc=log_mean, scale=log_sd) - norm.cdf(bounds[:,0], loc=log_mean, scale=log_sd)
expected_counts = bin_probs * scaled_inputs[:, np.newaxis]
counts = NegativeBinomial('counts', mu=expected_counts, alpha=np.array(scaled_counts.sum(axis=0)).reshape(1, 6), observed=scaled_counts, shape=(scaled_counts.shape[0],6))
with model:
trace=sample(2000, step=NUTS())
В любом случае, проблема в строке probs =
.Вызов norm(bounds[:,1], loc=test_array, scale=0.5)
(из scipy.stats
) с bounds[:,1].shape = (6,)
и test_array.shape = (19217,1)
работает нормально.Применяются правила вещания, и я получаю вывод массива (19217,6)
.Однако, когда я заменяю log_mean
на test_array
, я получаю сообщение об ошибке ValueError: setting an array element with a sequence.
.Это странно, поскольку я могу проверить (используя print(log_mean.tag.test_value.shape)
), что log_mean.shape = (19217,1)
.
Интересно, что я делаю неправильно.Кажется, это не результат присущей многомерности, поскольку я могу заменить аргумент формы на 1 и все равно получить неправильный результат.Это как-то связано с попыткой передать pymc3 RV в функцию scipy?Значит ли это, что мне придется реализовать cdf для обычного RV с pm.math
?Спасибо!
Отредактировано 05.03.19 с импортом.