Вопрос или проблема
В настоящее время я пытаюсь создать простую модель гауссовой смеси с несколькими переменными, используя tensorflow probability. В частности, у меня есть данные с 2-мерными входами и 2-мерными выходами, и я ищу способ создать вероятностную модель, которая наилучшим образом подходит для этих данных, используя нейронную сеть. Я использую tfp.layers.MixtureSameFamily для генерации этой модели, которая работает именно так, как и ожидалось. Вот мой код для этого:
Примечания: я использую tensorflow 2.4.1 и tensorflow-probability 0.12.1
x = некоторые 2-мерные входные данные
y = некоторые 2-мерные выходные данные
event_shape = y.shape[-1]
num_components = 5
params_size = tfp.layers.MixtureSameFamily.params_size(
num_components,
component_params_size=tfp.layers.MultivariateNormalTriL.params_size(event_shape))
model = tf.keras.Sequential([
tf.keras.layers.Dense(params_size),
tfp.layers.MixtureSameFamily(num_components, tfp.layers.MultivariateNormalTriL(event_shape)),
])
model.compile(optimizer=tf.optimizers.Adam(learning_rate=0.01),
loss=lambda y, model1: -model1.log_prob(y),
metrics=[])
batch_size = 250
model.fit(x, y,
batch_size=batch_size,
epochs=500,
steps_per_epoch=n // batch_size,
verbose=False,
shuffle=True)
yhat_mix=model(x_tst)
Однако, после того как сеть была обучена и модель была создана, я не знаю, как извлечь конкретную информацию, которая меня интересует, т.е. средние и ковариации компонент 2-мерных гауссов, составляющих модель смеси. Существует ли простой способ извлечь эту информацию? Я искал что-то вроде “.mean()” и “.covariance()”, но которые дают индивидуальные компоненты средние и ковариации, а не для всей распределения. Я думал, что использование “.mode()” может помочь, так как я частично ищу моды всего распределения, но это просто возвращает следующую ошибку:
NotImplementedError Traceback (most recent call last)
in
----> 1 yhat_mix.mode()
~\anaconda3\envs\py36\lib\site-packages\tensorflow_probability\python\distributions\distribution.py in mode(self, name, **kwargs)
1394 """Mode."""
1395 with self._name_and_control_scope(name):
-> 1396 return self._mode(**kwargs)
1397
1398 def _cross_entropy(self, other):
~\anaconda3\envs\py36\lib\site-packages\tensorflow_probability\python\distributions\distribution.py in _mode(self, **kwargs)
1389 def _mode(self, **kwargs):
1390 raise NotImplementedError('mode is not implemented: {}'.format(
-> 1391 type(self).name))
1392
1393 def mode(self, name="mode", **kwargs):
NotImplementedError: mode is not implemented: MixtureSameFamily
В идеале, я мог бы получить параметры, которые определяют все многомерные распределения компонентов (их средние и ковариации), а не только местоположения мод модели смеси. Кто-нибудь знает, как получить эту информацию? Любая помощь будет оценена, спасибо!
Значения, которые вы ищете, являются весами вашего плотного слоя. model.weights[1][...]
должно сработать. Ознакомьтесь с этим учебным пособием: https://www.richard-stanton.com/2020/07/14/tfp-fit-normal.html
Ответ или решение
Чтобы извлечь параметры компонент в многомерной гауссовой смеси, построенной с использованием TensorFlow Probability, необходимо учитывать структуру, которую вы задали в модели. Давайте подробно рассмотрим, как это сделать.
Введение
Вы уже создали модель многомерной гауссовой смеси с использованием tfp.layers.MixtureSameFamily
для двухмерных данных, и ваша основная цель сейчас — извлечь параметры, такие как средние значения и ковариационные матрицы для каждой компоненты. Ваша модель успешно обучена, и теперь мы можем использовать её для получения необходимых параметров.
Извлечение параметров
После обучения модели параметры компонент в многомерной гауссовой смеси находятся в весах, которые были обучены. Ваша модель содержит несколько слоев, и вам необходимо сосредоточиться на конкретных слоях, которые генерируют распределения.
1. Получение весов из модели:
Как правило, параметры MixtureSameFamily
хранятся в весах модели. Вы можете получить их с помощью доступа к атрибуту weights
. Сначала вам нужно будет достать параметры из нужного слоя:
# Получаем весовые коэффициенты модели
weights = model.weights
# Извлекаем параметры из слоя MixtureSameFamily
mixture_layer = model.layers[1] # Предполагаем, что второй слой - это MixtureSameFamily
params = mixture_layer.get_weights()
2. Параметры компонент:
Теперь давайте извлечем средние значения и ковариации для каждой из компонент. Зная, что у нас есть num_components
, и что компонентами являются многомерные нормальные распределения с параметрами:
means
: средние значения компонентcovariances
: ковариационные матрицы компонент
num_components = mixture_layer.num_components
event_shape = mixture_layer.event_shape
# Сначала извлекаем средние значения
means = params[0].reshape((num_components, event_shape))
# Теперь извлекаем нижний триугольный фактор (Cholesky) ковариационной матрицы
lambdas = params[1] # Ожидаем, что вторым элементом будут Cholesky факторы
covariances = [tf.linalg.matmul(lamba, lamba, transpose_b=True) for lamba in lambdas]
Итог
Теперь у вас есть матрицы средних значений (means
) и ковариационные матрицы (covariances
) для каждой из компонент. Эти параметры определяют поведение каждой из многомерных нормальных распределений, составляющих вашу смесь.
Заключение
Таким образом, извлечение параметров компонент из модели многомерной гауссовой смеси в TensorFlow Probability позволяет вам глубже анализировать построенную модель. Вы можете использовать полученные параметры для дальнейших прогнозов, визуализации или других статистических анализов, связанных с вашим набором данных.
Если у вас возникнут дополнительные вопросы по реализации или использованию полученных параметров, не hesistating to reach out for further assistance!