Gpflow 关于贝叶斯GP-LVM实现细节的问题

Gpflow 关于贝叶斯GP-LVM实现细节的问题,gpflow,gaussian-process,Gpflow,Gaussian Process,我想了解Bayesian GPLVM实现在GPflow中是如何工作的,但我正在为几行代码而挣扎。如果您能在以下问题上给予我帮助,我将不胜感激: 我了解到,第178行中的矩阵B: B=AAT+tf.eye(num\u,dtype=default\u float()) 对应于的等式14中的$\beta\Psi_2+K{MM}$。但是,我不明白代码是如何实现这个表达式的 关于上一个问题,我无法理解第175-181行中A、tmp、AAT和c的含义 我猜代码使用的是矩阵求逆引理,但我看不出是如何实现的 在

我想了解Bayesian GPLVM实现在GPflow中是如何工作的,但我正在为几行代码而挣扎。如果您能在以下问题上给予我帮助,我将不胜感激:

  • 我了解到,第178行中的矩阵B:
  • B=AAT+tf.eye(num\u,dtype=default\u float())

    对应于的等式14中的$\beta\Psi_2+K{MM}$。但是,我不明白代码是如何实现这个表达式的

  • 关于上一个问题,我无法理解第175-181行中A、tmp、AAT和c的含义
  • 我猜代码使用的是矩阵求逆引理,但我看不出是如何实现的

  • 在公式14中,有三个术语我无法理解它们是如何计算的:

    • 0.5\beta^2 y\u d^T\Psi_1(\beta\Psi_2+K_{MM})^{-1}\Psi_1^T y\d(该公式出现在等式14下方的W表达式中)
    • 0.5dβTr(K{MM}^{-1}\Psi\u2)
    • 0.5d\log | K{MM}|
  • 如果有任何提示,我将不胜感激


    诚恳地说,Joaquin计算elbo gplvm.py的代码非常优雅高效。如果有人想理解,我会在下面回答我之前的问题,并进一步发帖

  • 我知道第gplvm.py:182行中的矩阵B:
  • B=AAT+tf.eye(num\u,dtype=default\u float())

    对应于Titsias公式14中的$\beta\Psi_2+K{MM}$,以及 劳伦斯2010。然而,我不明白gplvm代码是如何运行的 实现文件中的表达式

    将Titsias和Lawrence 2010(即TL10)公式14中的矩阵$\beta\Psi_2+K{MM}$称为D。在gplvm.py中,该矩阵计算为D=LBL,其中B为上述矩阵(即B=AAT+i),L为K{MM}的Choleskly因子

  • 关于上一个问题,我无法理解代码中A、tmp、AAT和c的含义
  • A=tf.linalg.triangal_solve(L,tf.transpose(psi1),lower=True)/sigma tmp=tf.linalg.triangal_solve(L,psi2,lower=True) AAT=tf.linalg.triangal_solve(L,tf.transpose(tmp),lower=True)/sigma2 B=AAT+tf.eye(num\u,dtype=default\u float()) LB=tf.linalg.cholesky(B) log_det_B=2.0*tf.reduce_sum(tf.math.log(tf.linalg.diag_part(LB))) c=tf.linalg.triangal_solve(LB,tf.linalg.matmul(A,Y_数据),lower=True)/sigma

    我猜代码使用的是矩阵求逆引理,但我看不出是如何实现的

    该代码不使用矩阵求逆引理

    TL10等式14中的数据项(即指数中的项)通过取向量c的norm2的平方来计算

    AAT是TL10(即,$K{MM}^{-1)\Psi_2)$中等式~14中最后一项的轨迹内出现的矩阵

  • 在2010年Titsias和Lawrence的等式14中,有三个术语我无法理解它们是如何计算的:>
    • 0.5\beta^2 y\u d^T\Psi\u 1(\beta\Psi\u 2+K\u{MM})^{-1}\Psi\u 1^T y\d

    • 0.5dβTr(K{MM}^{-1}\Psi\u2)

    • 0.5d\log | K{MM}|

  • 如上所述,第一项通过取向量c的norm2的平方来计算,第二项通过取AAT的轨迹来计算。TL10等式14中两个对数行列式的减法(和第三项)通过取log | B |来计算

    漂亮的代码,谢谢

    A = tf.linalg.triangular_solve(L, tf.transpose(psi1), lower=True) / sigma
    tmp = tf.linalg.triangular_solve(L, psi2, lower=True)
    AAT = tf.linalg.triangular_solve(L, tf.transpose(tmp), lower=True) / sigma2
    B = AAT + tf.eye(num_inducing, dtype=default_float())
    LB = tf.linalg.cholesky(B)
    log_det_B = 2.0 * tf.reduce_sum(tf.math.log(tf.linalg.diag_part(LB)))
    c = tf.linalg.triangular_solve(LB, tf.linalg.matmul(A, Y_data), lower=True) / sigma