Как создать сумму различных объектов ядра в TensorFlow Probability? - PullRequest
0 голосов
/ 18 мая 2019

У меня есть один вопрос об указании функции ядра в Tensorflow-probability.

Обычно, если я хочу создать объект ядра, я пишу

import tensorflow as tf
import tensorflow_probability as tfp
tfp_kernels = tfp.positive_semidefinite_kernels

kernel_obj = tfp_kernels.ExponentiateQuadratic(*args, **karwgs)

Я знаю, что объект ядраПоддержка пакетного вещания.Но что, если я хочу построить объект ядра, который является суммой нескольких различных объектов ядра, например аддитивных гауссовских процессов?

Я не уверен, как «суммировать» объект ядра в Tensorflow.Что я могу сделать, так это создать несколько отдельных объектов ядра K1, ... KJ Похоже, что в сети нет аналогичных вопросов.

Заранее спасибо за помощь.


Обновления: Я пробовал прямой +, но что-то странное с ковариационной матрицей.

Я составил следующий пример:

feature1 = np.array([1, 2, 3, 5], dtype=np.float32)[:, np.newaxis]
feature2 = np.array([4.2, 6.5, 7.4, 8.3], dtype=np.float32)[:, np.newaxis]
features = np.concatenate([feature1, feature2], axis=1)

k1 = tfp_kernels.ExponentiatedQuadratic(amplitude=tf.cast(2.0, tf.float32),
                                        length_scale=tf.cast(2.0, tf.float32),
                                        feature_ndims=1,
                                        name='k1')

k2 = tfp_kernels.ExponentiatedQuadratic(amplitude=tf.cast(1.5, tf.float32),
                                        length_scale=tf.cast(1.5, tf.float32),
                                        feature_ndims=1,
                                        name='k2')

K = k1 + k2


gp_1 = tfd.GaussianProcess(kernel=k1,
                           index_points=feature1,
                           jitter=tf.cast(0, tf.float32),
                           name='gp_1')

gp_2 = tfd.GaussianProcess(kernel=k2,
                           index_points=feature2,
                           jitter=tf.cast(0, tf.float32),
                           name='gp_2')

gp_K1 = tfd.GaussianProcess(kernel=K,
                           index_points=feature1,
                           jitter=tf.cast(0, tf.float32),
                           name='gp_K')

gp_K2 = tfd.GaussianProcess(kernel=K,
                           index_points=feature2,
                           jitter=tf.cast(0, tf.float32),
                           name='gp_K')

gp_K = tfd.GaussianProcess(kernel=K,
                           index_points=features,
                           jitter=tf.cast(0, tf.float32),
                           name='gp_K')


gp_1_cov = gp_1.covariance()
gp_2_cov = gp_2.covariance()
gp_K1_cov = gp_K1.covariance()
gp_K2_cov = gp_K2.covariance()
gp_K_cov = gp_K.covariance()

with tf.Session() as my_sess:
    [gp_1_cov_, gp_2_cov_, gp_K1_cov_, gp_K2_cov_, gp_K_cov_] = my_sess.run([gp_1_cov, gp_2_cov, gp_K1_cov, gp_K2_cov, gp_K_cov])
my_sess.close()

print(gp_1_cov_)
print(gp_2_cov_)
print(gp_K1_cov_)
print(gp_K2_cov_)
print(gp_K_cov_)

Первые четыре ковариационные матрицы хороши, и я проверяю их дважды, сравнивая k(x_i, x_j) поэлементно.

Однако я не знаю, как он вычисляет последнюю.Я попытался

  1. feature_1 с kernel_1 и feature_2 с kernel_2
  2. feature_1 с kernel_2 и feature_2 с kernel_1

Ниже приведены результаты трех последних матриц:

[[6.25       5.331647   3.3511252  0.60561347]
 [5.331647   6.25       5.331647   1.6031142 ]
 [3.3511252  5.331647   6.25       3.3511252 ]
 [0.60561347 1.6031142  3.3511252  6.25      ]]
[[6.25       2.7592793  1.3433135  0.54289836]
 [2.7592793  6.25       5.494186   3.7630994 ]
 [1.3433135  5.494186   6.25       5.494186  ]
 [0.54289836 3.7630994  5.494186   6.25      ]]
[[6.25       2.3782768  0.769587   0.06774138]
 [2.3782768  6.25       4.694947   1.0143608 ]
 [0.769587   4.694947   6.25       2.9651313 ]
 [0.06774138 1.0143608  2.9651313  6.25      ]]

Они не совпадают с моим результатом.Кто-нибудь знает, как они вычисляют последнюю матрицу с разными index_points?

Или вообще, как мне указать ядро, чтобы они могли соответствовать модели, например additive Gaussian processes, где разные index_points соответствуют разным функциям ядра, чтобы я мог соответствовать модели y_i = f_1(x_{1,i}) + f_2(x_{2,i}) + ...в рамках вероятности TensorFlow?

1 Ответ

0 голосов
/ 19 мая 2019

Вы можете просто написать k_sum = k1 + k2! Посмотрите на базовый класс PositiveSemidefiniteKernel, где мы переопределили операторы сложения и умножения, и вы хотите узнать, как он работает.

...