2

我正在使用以下功能:

kernel = @(X,Y,sigma) exp((-pdist2(X,Y,'euclidean').^2)./(2*sigma^2));

通过以下方式计算一系列内核:

K = [(1:size(featureVectors,1))', kernel(featureVectors,featureVectors, sigma)];

然而,由于featureVectors是一个巨大的矩阵(例如 10000x10000),计算内核需要长时间(例如,K)。

是否有可能以某种方式加快计算速度?


编辑:上下文

libsvm正如您可能已经从变量名和语义中注意到的那样,我正在使用带有高斯内核的分类器。

我现在正在使用(或多或少)#terms~=10000#docs~=10000. 这个#terms 是在停用词删除和词干提取之后产生的。本课程表明拥有10000功能是有意义的。

不幸的是,libsvm不会自动实现高斯内核。因此,需要手动计算。我从这里得到了这个想法,但是内核计算(正如引用的问题所建议的那样)真的很慢。

4

2 回答 2

1

您正在使用pdist2两个相等的输入参数(X并且Y在您调用时相等kernel)。通过只计算每对一次,您可以节省一半的时间。你这样做使用pdist然后squareform

kernel = @(X,sigma) exp((-squareform(pdist(X,'euclidean')).^2)./(2*sigma^2));
K = [(1:size(featureVectors,1))', kernel(featureVectors, sigma)];
于 2014-05-28T13:47:17.533 回答
0

你的指数函数会下降得很快。对于几个距离,sigma您的核函数基本上为零。这些案例我们可以梳理并变得更快。

function z = kernel(X, Y, sigma)
  d = pdist2(X,Y,'euclidean');
  z = zeros(size(d)); % start with zeros
  m = d < 3 * sigma;
  z(m) = exp(-d(m).^2/(2*sigma^2));
end
于 2014-05-28T11:37:25.900 回答