【问题标题】:How to create sum of different kernel objects in TensorFlow Probability?如何在 TensorFlow Probability 中创建不同内核对象的总和?
【发布时间】:2019-05-18 14:31:06
【问题描述】:

我有一个关于在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对应不同的内核函数,这样我可以在TensorFlow Probability下拟合模型y_i = f_1(x_{1,i}) + f_2(x_{2,i}) + ...框架?

【问题讨论】:

    标签: python python-3.x tensorflow tensorflow-probability


    【解决方案1】:

    你可以写k_sum = k1 + k2!查看基类 PositiveSemidefiniteKernel,我们在其中覆盖了加法和乘法运算符,您想看看它是如何工作的。

    【讨论】:

    • 我想知道是否可以通过k_sum 与不同的index_points 设置高斯过程obj,例如y_i = f_1(x_{1,i}) + f_2(x_{2,i})?我刚才尝试了+,但是如果我的index_points 是两个不同的列,那么协方差矩阵就没有意义了。
    • 啊,是的,所以我们有一个支持“切片”内核的设计,这将使您能够做到这一点。我正在努力检查有助于支持它的部件。我会尽快跟进!
    猜你喜欢
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 2020-02-18
    • 1970-01-01
    相关资源
    最近更新 更多