【发布时间】:2017-06-01 12:44:52
【问题描述】:
我正在使用 Matlab 执行大量迭代,并使用偏最小二乘法 (PLS) 作为每次迭代中处理数据的算法。它运行得很慢。使用profile 监控我的代码的每一行使用的时间表明X = X-t*p' 行,其中X 是大小为r 的矩阵c 和t 和p 是列向量大小为r 和c,大部分时间都需要花费。我认为原因可能是t*p' 扩展了内存,它从两个向量生成了一个矩阵,这是一个众所周知的原因,它会减慢 Matlab 中的计算速度。有没有办法加快这个速度?
PLS 代码是:
for iter = 1:maxiter % maxiter is defaultedly set as 10,000
% preparing data....
......
% perform PLS using NIPALS algorithm
for a = 1:A
x = X'*y;
w = x/norm(x);
t = X*w;
tt = sum(t.^2);
p = X'*(t/tt);
q = sum(y.*t)/tt;
X = X-t*p'; % updata X, this line costs most of the time
y = y-t*q; % updata y
end
% output w, P, q
.......
end
【问题讨论】:
-
我认为内置的向量乘法已经是一个很好的实现,你不能轻易地进一步优化。研究其他一些优化可能会更好:你能调整你的算法来避免乘法吗?你可以使用更少的迭代次数吗?
-
为什么我被否决了?如果我能找到解决方案,我想我不会在这里发布任何问题。
-
@m7913d 我同意你的观点,Matlab 极大地优化了矩阵乘法。所以我发布了我实现的算法。我花了几天时间尝试优化算法并减少迭代次数,但失败了。
-
如果您想总体上优化您的 PLS 算法,最好将其反映在您的标题中。你试过
plsregress吗? -
@m7913d 很好的提醒。它比我的要快得多。但是输出结果中存在问题可能是因为
plsregress没有适合我的情况的参数,所以我会仔细研究Matlab实现PLS的方式,找出任何可以加快我的PLS的技巧。谢谢。
标签: matlab vector matrix-multiplication