MATLAB优化:加速大型矩阵的计算

时间:2014-05-28 11:26:16

标签: performance matlab time kernel function-handle

我正在使用以下功能:

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是在删除和删除词后产生的。 This course表示拥有10000功能是有道理的。

不幸的是,libsvm没有自动实现高斯内核。因此,需要手动计算它。我从here接受了这个想法,但是内核计算(如引用的问题所示)非常慢。

2 个答案:

答案 0 :(得分:1)

当您调用pdist2时,您正在使用X两个相等的输入参数(Ykernel相等。您只需计算一次,即可节省一半的时间。您可以使用pdist然后使用squareform

来执行此操作
kernel = @(X,sigma) exp((-squareform(pdist(X,'euclidean')).^2)./(2*sigma^2));
K = [(1:size(featureVectors,1))', kernel(featureVectors, sigma)];

答案 1 :(得分: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