【问题标题】:Fast Constrained Least Squares快速约束最小二乘
【发布时间】: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


【解决方案1】:

如 cmets 中所述:使用的命令经过高度优化,切换语言不会有什么不同。

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

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

doc lsqlin看来,决定速度的两个主要参数是:

  • 迭代次数
  • 可接受的容差

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

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

【讨论】:

    猜你喜欢
    • 2010-12-05
    • 2015-08-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 2019-07-19
    • 2019-02-04
    相关资源
    最近更新 更多