Tensorflow смешивает два многомерных распределения

#python #tensorflow #tensorflow-probability

#python #tensorflow #tensorflow-вероятность

Вопрос:

Я хотел бы смешать два многомерных распределения в tensorflow. Например:

 import tensorflow_probability as tfp
import tensorflow as tf
import numpy as np
tfd = tfp.distributions

#mean,var,pi have the same shape(3,4).
mean = tf.convert_to_tensor(np.arange(12.0).reshape(3,4))
var = mean
dist = tfd.Normal(loc=mean,scale=var)
pi = tf.ones_like(mean)
mix = tfd.Mixture(cat = tfd.Categorical(probs=[pi,1-pi]),components=[dist,dist])
  

Однако он выдал ошибку следующего вида:

Ошибка значения: измерения 2 и 3 несовместимы

Ошибка значения: формы (2, 3) и (3, 4) несовместимы

Могу ли я смешать два многомерных распределения в tensorflow?

Ответ №1:

Попробуйте, решит ли это вашу проблему

 import numpy as np
import tensorflow as tf
import tensorflow_probability as tfp
tfd = tfp.distributions 

#mean,var,pi have the same shape(3,4).
mean = tf.convert_to_tensor(np.arange(12.0).reshape(3,4))
var = mean
dist = tfd.Normal(loc=-1., scale=0.1)

pi = tf.transpose(tf.ones_like(mean))

mix = tfd.Mixture(cat = tfd.Categorical(probs=[pi/3,
                                               pi/3,
                                               pi/3]), 
                  components=[tfd.Normal(loc=mean,scale=var), 
                              tfd.Normal(loc=mean,scale=var), 
                              tfd.Normal(loc=mean,scale=var)]
                 )

mix.event_shape_tensor
  

вывод

 <bound method Distribution.event_shape_tensor of <tfp.distributions.Mixture 'Mixture_11/' batch_shape=(3, 4) event_shape=() dtype=float64>>
  

Комментарии:

1. Спасибо за вашу помощь. Кажется, что это не работает, если компоненты содержат только два дистрибутива. Я не уверен, почему это происходит. mix = tfd.Mixture(cat = tfd.Categorical(probs=[pi/2,pi/2]),components=[dist,dist]) . В любом случае, спасибо.

2. Я думаю, это может быть потому, что ваше среднее значение / var не являются квадратными матрицами.

3. Я думаю, вы правы. Я нашел другое решение для этого. Вместо того, чтобы присваивать вероятность pi #shape(3,4) , я присваиваю ее pi #shape(3,4,2) . Это означает, что каждый элемент pi является списком вероятностей, например. pi[0][0] = [0.5,0.5] . Это работает. Большое спасибо.

Ответ №2:

хитрость в том, что, похоже, количество категорий должно быть последним измерением в probs, этот код работает для меня:

В:

 mix = tfd.Mixture(cat = tfd.Categorical(probs=tf.stack([pi,1-pi],axis=-1)),components=[dist,dist])
mix
  

Выход:

 <tfp.distributions.Mixture 'Mixture' batch_shape=[3, 4] event_shape=[] dtype=float64>