我正在使用以下功能:
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接受了这个想法,但是内核计算(如引用的问题所示)非常慢。
答案 0 :(得分: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)];
答案 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