在 Python 中使用线性约束解决最小二乘问题

计算科学 优化 Python 凸优化 最小二乘 二次规划
2021-11-25 02:23:09

我需要解决

minxAxb22,s.t.ixi=1,xi0,i.

认为这是一个二次问题,应该可以用CVXOPT解决,但我不知道如何解决。

2个回答

在发现CVXPY之前,我写了一个完整的答案(在行下方),它(如 MATLAB 的 CVX)为您完成了所有困难的事情,并且有一个非常简短的示例,几乎与您的示例相同您只需要将相关行替换为

 p = program(minimize(norm2(A*x-b)),[equals(sum(x),1),geq(x,0)])

我的旧答案,用 CVXOPT 做起来更难:

按照 Geoff 对目标函数求平方的建议,

Axb22=xTATbT,Axb=xTATAxbTAxxTAbbTb

当然,所有术语都是标量,因此您可以转置第三个并删除最后一个(因为它不依赖于,因此不会改变为您提供的最小值,尽管您需要将其添加回来在求解后以获得目标的正确值)以获得 这(包括您的约束)具有二次程序的形式,如此处的 CVXOPT 文档,其中还有用于解决此类问题的示例代码。xx

xTATAxbT(A+AT)x

而不是你解决的问题,解决

minxAxb22,s.t.ixi=1,xi0,i.

这个问题是一个可微的、凸的、非线性的优化问题,可以在 CVXOPT、IPOPT 或任何其他凸优化求解器中求解。