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 时,XY 相等)。通过只计算每对一次,您可以节省一半的时间。你可以使用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 优化:加速大型矩阵的计算的主要内容,如果未能解决你的问题,请参考以下文章

DSP Math加速优化整理

精通MATLAB最优化计算的实 例 目 录

DSP Math加速优化整理

基于GA优化算法的磁性贴片位置布置优化算法matlab仿真

计算(sin(x)-x)*x^{-3}的优化算法(matlab中)

如何用MATLAB核心运行Python代码来加速计算?