MATLAB和Python中线性规划的冲突解

MATLAB和Python中线性规划的冲突解,python,matlab,optimization,linear-programming,cvxopt,Python,Matlab,Optimization,Linear Programming,Cvxopt,我正在尝试运行一个大型线性程序,并将我以前的一些代码从MATLAB翻译成Python。然而,问题是MATLAB和Python给了我截然不同的答案:MATLAB代码找到了最佳解决方案,而Python代码说这个问题是不可行的。这是ell_无穷大回归或极大极小回归的LP模型。我对这两项功能的设置相当有信心 MATLAB代码: function [ x_opt, f_opt, exitflag, output] = ell_infinity_reg_solver( A, b ) % Solves the

我正在尝试运行一个大型线性程序,并将我以前的一些代码从MATLAB翻译成Python。然而,问题是MATLAB和Python给了我截然不同的答案:MATLAB代码找到了最佳解决方案,而Python代码说这个问题是不可行的。这是ell_无穷大回归或极大极小回归的LP模型。我对这两项功能的设置相当有信心

MATLAB代码:

function [ x_opt, f_opt, exitflag, output] = ell_infinity_reg_solver( A, b )
% Solves the ell_infinity regression problem ||Ax - b||_inf.  That is finds
% the least t for which Ax - b < t.ones and Ax - b > -t.ones.
[n,d] = size(A) ;  
if n == 0
    f_opt  = 0 ;
    x_opt = zeros(d,1) ;
    return
end

% infinity norm
f = [ zeros(d,1); 1 ];
A = sparse([ A, -ones(n,1) ; -A, -ones(n,1) ]);
b = [ b; -b ];
[xt, f_opt, exitflag, output] = linprog(f,A,b);
x_opt = xt(1:d,:);


end
但这再次返回了一个
双重不可行
的标志,这与所使用的MATLAB
exitflag=1
(成功)和
双重单纯形
算法形成了对比

我测试的数据是一个500×11的数据矩阵,带有一组相关的响应变量

我感兴趣的是,是什么导致了产出上如此显著的差异,以及哪一个是正确的。增加混乱的一件事是,将输入的大小减少到小于满秩的大小似乎不会影响MATLAB输出标志,但Python代码没有找到最佳解决方案(我认为这是意料之中的)

数据位于,矩阵A是前11列,目标向量是最后一列。

(1)默认变量边界几乎总是零和无穷大。即,除非另有说明,否则大多数解算器假设非负变量。Matlab使用不同的默认值。默认情况下,这些变量是免费的

对于您的模型,这意味着您需要明确地告诉
linprog
x
变量是自由的。
t
变量可以是自由变量,也可以是非负变量

因此

对于单纯形法,模型有点大(单纯形实现有点像玩具算法)。新的内点法没有问题

(2) 线路

应该读一下

big_A = np.hstack((np.vstack((A,-A)), -np.ones((2*n,1))))
(3) 还请注意,您的模型

min t :
Ax - b <= t * ones
b - Ax >= - t*ones
mint:
Ax-b=-t*one
这是不正确的。应该是:

min t :
Ax - b <= t * ones
Ax - b >= - t*ones
mint:
Ax-b=-t*one
这将作为LP输入提供:

min t :
 Ax - t <= b
-Ax - t  <= -b
mint:

Ax-t如果您的问题确实很大,我建议使用外部解算器(在
scipy
中),例如mosek(),它是唯一能够在合理时间内为我生成解决方案的解算器。谢谢,这真的很有帮助。你知道ell_-infty回归的任何具体应用吗?我已经阅读了你链接中的信息来源,并对自己进行了搜索,但发现很难确定这一点。@CharlieDickens参见例如。还有一个变体也很有趣:最小平方中值问题。这本书读起来很有趣,谢谢。有一件事我不太明白,那就是你的链接和正文(特别是第6章)之间的区别。在你的博客中,你曾写道选择n=h意味着LMS问题简化为切比雪夫回归——这是有道理的。然而,Farebrother C6 abstract说,选择大约一半的数据,运行L-inf回归,然后做一些看起来不清楚的事情,得到一个稳健的LMS估计。你知道有一个参数可以使这变得严格吗?你可以从n个组合中生成所有可能的h,并对它们进行切比雪夫回归。然后挑一个最好的。这只适用于最小的问题。因此,一个启发式方法是:从n个组合中抽取大量的h,然后选择最好的。希望是接近最佳状态。我展示了一种不同的方法:让MIP模型从n中选择最优的h(基本上是将切比雪夫和选取最小的h组合成一个优化问题)。。
big_A = np.hstack((np.vstack((A,-A)), -np.ones((2*n,1))))
min t :
Ax - b <= t * ones
b - Ax >= - t*ones
min t :
Ax - b <= t * ones
Ax - b >= - t*ones
min t :
 Ax - t <= b
-Ax - t  <= -b