Извлечение средних значений и ковариаций компонентов из смешанной модели

Вопрос или проблема

В настоящее время я пытаюсь создать простую модель гауссовой смеси с несколькими переменными, используя 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!

Оцените материал
Добавить комментарий

Капча загружается...