首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >sklearn.gaussian_process.kernels.Matern的矢量化评价

sklearn.gaussian_process.kernels.Matern的矢量化评价
EN

Stack Overflow用户
提问于 2022-07-12 09:58:17
回答 1查看 71关注 0票数 2

文档的角度来看,我不清楚__call__内核在sklearn.gaussian_process.kernels中是如何工作的。特别是,我想为网格K = k(x_i, x_j)中的所有元素对( x_i, x_j )构建矩阵x。对我来说,直观的方法是执行一个meshgrid操作,然后将它提供给内核。显然,这不起作用(见图),但通过两个嵌套循环,我得到了我期望的结果(再次看到图片)。如何避免下面代码中的双循环?

代码语言:javascript
运行
复制
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)

编辑:

我(几乎)通过使用

代码语言:javascript
运行
复制
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循环版本一致,并且与其他版本不同。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-12 12:01:13

正确执行:

代码语言:javascript
运行
复制
x_eval = np.reshape(x, [n, 1])
k1 = kernel(x_eval)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72950440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档