Python 快速约束最小二乘法
我必须解决许多独立的约束线性最小二乘问题(有界和约束)。所以我在循环中多次这样做。对于每一个问题,我寻找的x是min | | Cx-d | |,x是有界的(在0,1中),并且所有x元素的和必须为1 我正在寻找一种快速实现的方法,因为尽管每次优化不需要很多时间,但我需要将其包含在一个大循环中 例如,我的Matlab实现如下所示: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
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
中,确定速度的两个主要参数如下:
- 迭代次数
- 公认的容忍度
如果所有这些都没有帮助的话,请考虑一些类似的技巧:
- 只解决完全不同的问题
- 使用更简单的约束进行求解,并将结果四舍五入
x0
:这将加快优化。如果Matlab允许,您也可以尝试并行运行计算。@user2606048缓存结果如何,这样如果像素值相等(或非常接近),您就不必重新计算解决方案了?@user2606048还可以尝试调整算法参数。例如,由于这些算法执行迭代直到达到阈值,因此可以提高阈值以在精度和速度之间进行权衡。