我不清楚sklearn.gaussian_process.kernels
中Matern内核的__call__
函数是如何工作的.
from sklearn.gaussian_process.kernels import Matern
import numpy as np
import matplotlib.pyplot as plt
n = 51
x = np.linspace(0, 1, n)
kernel = Matern(length_scale=1, nu=1.5)
xx, yy = np.meshgrid(x, x)
# evaluate the kernel vectorially
k1 = kernel(xx, yy)
# evaluate the kernel with for loops
k2 = np.zeros([n, n])
for i in range(n):
for j in range(n):
k2[i, j] = kernel([[x[i]]], [[x[j]]])
plt.matshow(k1)
plt.matshow(k2)
Edit:
我(几乎)通过使用
x_eval = np.array([x, x]).T
k1 = kernel(x_eval)
矢量化版本和基于循环的版本之间仍然存在一些不可忽略的差异.一些 idea 为什么?
Edit 2:
上面Edit中得到k1
的代码是错误的,我用brew 的高斯核K(x_i, x_j) = exp(-(x_i - x_j)**2 / (2 * scale**2))
的实现进行了判断,它与参数nu=np.inf
的马特协方差相同.我获得的值与for循环版本一致,并且与另一个不同.