Определение DirichletMultinomial в вероятности тензорного потока
Это, вероятно, довольно простой, но я не могу понять - у меня есть матрица 100x5 y
это генерируется из Dirichlet-Multinomial, и я хочу вывести параметры гамма, используя вероятность тензорного потока. Ниже приведена модель, которую я реализовал (для простоты я предполагаю, что гамма сейчас одинакова для всех 5 классов):
def dirichlet_multinomial_model(S, p, N, tau):
gamma = ed.Gamma(2.0, 3.0, name='gamma')
y = ed.DirichletMultinomial(500, tf.ones(5)*gamma, name='y')
return y
log_joint = ed.make_log_joint_fn(dirichlet_multinomial_model)
def target_log_prob_fn(gamma):
return log_joint(
S=S, p=p, N=N, tau=tau,
gamma=gamma,
y=y)
Когда я пытаюсь сэмплировать это с помощью HMC, я получаю следующую ошибку:
ValueError: Несовместимая форма для аргумента инициализации 'value'. Ожидаемый (5,), получил (100, 5).
Таким образом, указание вектора гамма-длины длиной 5 привело к тому, что программа ожидала, что мои данные будут иметь форму 5x1. Я не могу решить, как правильно указать модель - любые указатели будут оценены.
1 ответ
Как подсказано в моем комментарии, исправление здесь заключается в использовании sample_shape=[100,]
вместо sample_shape=[100, 5]
, У нас есть три понятия формы в библиотеке TF Distributiontions (которую Эдвард переносит): форма образца, форма пакета и форма события.
Форма события описывает форму одного розыгрыша из распределения. Например, многомерное нормальное распределение в 5 измерениях имеет event_shape=[5,]
Форма партии описывает независимые, не идентично распределенные тиражи; "партия" распределений. Например, Normal(loc=[1., 2., 3], scale=1.)
имеет batch_shape 3 из-за 3 значений, переданных loc
параметр.
Образец формы описывает IID-чертежи из серии распределений. Полученный образец Tensor
имеет форму S + B + E
где S
, B
, а также E
являются образцами, партиями и формами событий соответственно.
В вашем примере DirichletMultinomial имеет параметр концентрации с формой [5,]
, Это соответствует форме события в распределении: каждый розыгрыш из этого распределения будет представлять собой набор из 5 целых чисел, складывающихся в total_count
, Когда вы производите выборку 100 раз, вы действительно получаете результат с shape=[100, 5]
но 5 подразумевается в форме события распределения - вы рисуете только 100 выборок, следовательно sample_shape=[100,]
Большая часть вышеприведенного текста взята из этого замечательного блокнота, в котором гораздо больше деталей о формах TF Distribution.
Надеюсь, это поможет прояснить ситуацию! Удачной выборки! ^_^