Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 快速约束最小二乘法_Python_R_Performance_Matlab_Optimization - Fatal编程技术网

Python 快速约束最小二乘法

Python 快速约束最小二乘法,python,r,performance,matlab,optimization,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

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

如评论中所述:所使用的命令经过了高度优化,而切换语言也不会有什么不同

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

如果你得出结论,你确实想做这个精确的计算,考虑改变设置,并玩弄算法。 从

doc lsqlin
中,确定速度的两个主要参数如下:

  • 迭代次数
  • 公认的容忍度

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

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

NumPy可能是一个很好的起点。它像MATLAB一样编写,比循环更快。你的方法不会得到显著的加速。这些函数在所有语言中都会得到高度优化,事实上,它们经常与相同的线性代数库接口来解决这个问题。提高速度的唯一方法是利用关于您的特定问题的一些附加信息/见解,因此您需要向我们提供一些细节。如果问题彼此接近,您可以指定找到的最后一个解决方案作为起点
x0
:这将加快优化。如果Matlab允许,您也可以尝试并行运行计算。@user2606048缓存结果如何,这样如果像素值相等(或非常接近),您就不必重新计算解决方案了?@user2606048还可以尝试调整算法参数。例如,由于这些算法执行迭代直到达到阈值,因此可以提高阈值以在精度和速度之间进行权衡。