【发布时间】:2013-08-06 05:40:28
【问题描述】:
我必须解决许多独立的约束线性最小二乘问题(包括边界和约束)。所以我在循环中多次这样做。对于每个问题,我正在寻找的 x 是 min||Cx-d||并且 x 是有界的(在 0,1 中)并且所有 x 元素的总和必须为 1。
我正在寻找一种快速完成的方法,因为虽然每次优化都不需要很多时间,但我需要将它包含在一个大循环中。
例如我的 Matlab 实现是这样的:
img = imread('test.tif');
C = randi(255,6,4);
x=zeros(size(C,2),1);
tp = zeros(size(C,2),1);
Aeq = ones(1,size(C,2));
beq = 1;
options = optimset('LargeScale','off','Display','off');
A = (-1).*eye(size(C,2));
b = zeros(1,size(C,2));
result = zeros(size(img,1),size(img,2),size(C,2));
for i=1:size(img,1)
for j=1:size(img,2)
for k=1:size(img,3)
tp(k) = img(i,j,k);
end
x = lsqlin(C,tp,A,b,Aeq,beq,[],[],[],options);
for l=1:size(C,2)
result(i,j,l)=x(l);
end
end
end
对于 500x500 的循环,大约需要 5 分钟。但我的循环比这大得多。欢迎任何想法,但我更喜欢 Matlab、Python 或 R 解决方案。
【问题讨论】:
-
NumPy 可能是一个不错的起点。它像 MATLAB 一样编写,而且比循环更快
-
您的方法不会显着加快速度。这些函数往往在所有语言中都得到了高度优化,实际上它们经常与相同的线性代数库接口来解决它。获得重大速度提升的唯一方法是利用一些关于您的具体问题的额外信息/见解,因此您需要向我们提供一些具体信息。
-
如果问题彼此接近,您可以将找到的最后一个解决方案指定为起点
x0:这应该会加快优化速度。如果 Matlab 允许,您也可以尝试并行运行计算。 -
@user2606048 缓存结果怎么样,如果像素值相等(或非常接近),您不必重新计算解决方案?
-
@user2606048 另外,您可以尝试调整算法参数。例如,由于这些算法会执行迭代直到达到阈值,因此您可以提高阈值以牺牲准确性来换取速度。
标签: python r performance matlab optimization