我有一个包含m列和n行的 numpy 数组,列是维度,行是数据点。
我现在需要为每个数据点组合计算内核值。
对于线性核我可以简单地做dot(X,X.T)
如何有效地计算高斯核的所有值给定s ?
我有一个包含m列和n行的 numpy 数组,列是维度,行是数据点。
我现在需要为每个数据点组合计算内核值。
对于线性核我可以简单地做dot(X,X.T)
如何有效地计算高斯核的所有值给定s ?
我认为主要问题是有效地获得成对距离。一旦你有了,剩下的就是元素明智的了。
为此,您可能需要使用 scipy。该功能scipy.spatial.distance.pdist
可以满足您的需求,并且scipy.spatial.distance.squareform
可能会减轻您的生活。
因此,如果您想要内核矩阵,请执行
from scipy.spatial.distance import pdist, squareform
# this is an NxD matrix, where N is number of items and D its dimensionalites
X = loaddata()
pairwise_dists = squareform(pdist(X, 'euclidean'))
K = scip.exp(-pairwise_dists ** 2 / s ** 2)
文档可以在这里找到。
作为bayerj答案的一个小附录,scipy的pdist
函数可以通过调用它来直接计算平方欧几里得范数pdist(X, 'sqeuclidean')
。然后可以更有效地编写完整的代码
from scipy.spatial.distance import pdist, squareform
# this is an NxD matrix, where N is number of items and D its dimensionalites
X = loaddata()
pairwise_sq_dists = squareform(pdist(X, 'sqeuclidean'))
K = scip.exp(-pairwise_sq_dists / s**2)
你也可以手写正方形:
import numpy as np
def vectorized_RBF_kernel(X, sigma):
# % This is equivalent to computing the kernel on every pair of examples
X2 = np.sum(np.multiply(X, X), 1) # sum colums of the matrix
K0 = X2 + X2.T - 2 * X * X.T
K = np.power(np.exp(-1.0 / sigma**2), K0)
return K
PS,但这会慢 30%
def my_kernel(X,Y):
K = np.zeros((X.shape[0],Y.shape[0]))
for i,x in enumerate(X):
for j,y in enumerate(Y):
K[i,j] = np.exp(-1*np.linalg.norm(x-y)**2)
return K
clf=SVR(kernel=my_kernel)
这等于
clf=SVR(kernel="rbf",gamma=1)
您可以从上面的代码中有效地计算 RBF,注意 gamma 值为 1,因为它是一个常数,您请求的 s 也是相同的常数。