在 PyMC3 中解析地求解高斯过程后验
Solving Gaussian Process posterior analytically in PyMC3
我习惯在 GPFlow 中进行高斯过程回归,它可以让您通过分析求解后验:
import gpflow as gp
from gpflow.kernels import RBF, White, Periodic, Linear
k = RBF(x.shape[1]) + White(x.shape[1])
m = gp.models.GPR(x, y, k)
self.model = m
m.compile()
opt = gp.train.ScipyOptimizer()
opt.minimize(m)
我最近搬到了 PyMC3 并试图完成与上述相同的事情。我在文档中找到了这段代码 (https://docs.pymc.io/notebooks/GP-slice-sampling.html#Examine-actual-posterior-distribution):
# Analytically compute posterior mean
L = np.linalg.cholesky(K_noise.eval())
alpha = np.linalg.solve(L.T, np.linalg.solve(L, f))
post_mean = np.dot(K_s.T.eval(), alpha)
最终我想使用 GP 对看不见的数据进行回归。使用 np.linalg
是解析求解 GP 后验的正确方法吗?
当然可以。如教程中所述,他们从 Rasmussen's GPML 实现了算法 2.1,他明确使用了左矩阵除法符号 (\
),这表明使用线性求解。例如理论上(即实数制),
A\b === A^(-1) * b === x
其中 x
求解 A*x = b
。但在实际的计算领域(例如 IEEE 浮点数)中,这种等价性被打破,因为 solve(A, b)
比 inv(A) * b
.
更快且数值更稳定
左矩阵除法 (\
) 符号在数值线性代数中很常见,我敢打赌,对其偏爱的最显着解释是它默认提醒学生 never不必要地计算逆矩阵。
我习惯在 GPFlow 中进行高斯过程回归,它可以让您通过分析求解后验:
import gpflow as gp
from gpflow.kernels import RBF, White, Periodic, Linear
k = RBF(x.shape[1]) + White(x.shape[1])
m = gp.models.GPR(x, y, k)
self.model = m
m.compile()
opt = gp.train.ScipyOptimizer()
opt.minimize(m)
我最近搬到了 PyMC3 并试图完成与上述相同的事情。我在文档中找到了这段代码 (https://docs.pymc.io/notebooks/GP-slice-sampling.html#Examine-actual-posterior-distribution):
# Analytically compute posterior mean
L = np.linalg.cholesky(K_noise.eval())
alpha = np.linalg.solve(L.T, np.linalg.solve(L, f))
post_mean = np.dot(K_s.T.eval(), alpha)
最终我想使用 GP 对看不见的数据进行回归。使用 np.linalg
是解析求解 GP 后验的正确方法吗?
当然可以。如教程中所述,他们从 Rasmussen's GPML 实现了算法 2.1,他明确使用了左矩阵除法符号 (\
),这表明使用线性求解。例如理论上(即实数制),
A\b === A^(-1) * b === x
其中 x
求解 A*x = b
。但在实际的计算领域(例如 IEEE 浮点数)中,这种等价性被打破,因为 solve(A, b)
比 inv(A) * b
.
左矩阵除法 (\
) 符号在数值线性代数中很常见,我敢打赌,对其偏爱的最显着解释是它默认提醒学生 never不必要地计算逆矩阵。