MATLAB 优化:加速大型矩阵的计算
Posted
技术标签:
【中文标题】MATLAB 优化:加速大型矩阵的计算【英文标题】:MATLAB optimization: speed up computation on large matrices 【发布时间】:2014-07-17 14:27:34 【问题描述】:我正在使用以下功能:
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 那里得到了这个想法,但是内核计算(正如引用的问题所建议的那样)真的很慢。
【问题讨论】:
也许sparse matrices 会帮助你。 你的特征向量真的有 20000 个元素吗?这听起来不正常。你真的想要每个特征向量之间的成对距离吗?正如您所发现的,当然不是最佳的,也不是可扩展的。我会说你需要更多地研究你的算法。你不会用“微”优化来解决这个问题。随意描述更高级别的问题以获得一些建议。 查看更新后的问题。 【参考方案1】:您正在使用 pdist2
和两个相等的输入参数(当您调用 kernel
时,X
和 Y
相等)。通过只计算每对一次,您可以节省一半的时间。你可以使用pdist
然后squareform
:
kernel = @(X,sigma) exp((-squareform(pdist(X,'euclidean')).^2)./(2*sigma^2));
K = [(1:size(featureVectors,1))', kernel(featureVectors, sigma)];
【讨论】:
【参考方案2】:你的指数函数会下降得很快。对于几个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
【讨论】:
@Eleanore 对不起,我想我误解了你。我完全改变了答案。以上是关于MATLAB 优化:加速大型矩阵的计算的主要内容,如果未能解决你的问题,请参考以下文章