快速约束最小二乘法

时间:2013-08-05 13:31:56

标签: python r performance matlab optimization

我必须解决许多独立的约束线性最小二乘问题(包括边界和约束)。所以我在循环中多次这样做。对于每个问题,我正在寻找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解决方案。

1 个答案:

答案 0 :(得分:0)

正如评论中所提到的:所使用的命令经过了高度优化,而且切换语言不会产生太大的影响。

首先回到你想要实现的目标,也许是为了实现你不需要解决这么多难题。

如果您得出结论,您确实想要进行这种精确计算,请考虑更改设置,并使用算法。

doc lsqlin开始,确定速度的两个主要参数是:

  • 迭代次数
  • 接受的容忍度

如果所有这些都没有帮助,请考虑一些技巧:

  • 只解决完全不同的问题
  • 使用更简单的约束进行求解,并将结果四舍五入