从文档的角度来看,我不清楚__call__
内核在sklearn.gaussian_process.kernels
中是如何工作的。特别是,我想为网格K = k(x_i, x_j)
中的所有元素对( x_i, x_j
)构建矩阵x
。对我来说,直观的方法是执行一个meshgrid
操作,然后将它提供给内核。显然,这不起作用(见图),但通过两个嵌套循环,我得到了我期望的结果(再次看到图片)。如何避免下面代码中的双循环?
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)
编辑:
我(几乎)通过使用
x_eval = np.array([x, x]).T
k1 = kernel(x_eval)
然而,矢量化和基于循环的版本之间还是有一些不可忽视的差别。一些想法,为什么?
编辑2:
在上面的k1
编辑中获取的代码是错误的,我用自编的高斯内核K(x_i, x_j) = exp(-(x_i - x_j)**2 / (2 * scale**2))
的实现进行了检查,它与参数nu=np.inf
的母体协方差相同。我获得的值与for循环版本一致,并且与其他版本不同。
发布于 2022-07-12 12:01:13
正确执行:
x_eval = np.reshape(x, [n, 1])
k1 = kernel(x_eval)
https://stackoverflow.com/questions/72950440
复制相似问题