Решение задачи наименьших квадратов с линейными ограничениями в Python

12

Мне нужно решить

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

Я думаю, что это квадратичная проблема, которая должна быть решена с помощью CVXOPT , но я не могу понять, как.

tillsten
источник
Я надеюсь, что этот вопрос не слишком специфичен для compsci.
Tillsten
Джефф Оксберри: Просто любопытство, но почему вы отредактировали линейную часть? Я думаю, что это довольно бессильная часть описания проблемы, решение было бы совсем другим для нелинейной оптимизации наименьших квадратов.
Tillsten
Кстати, другие правки великолепны!
Tillsten
Вы можете легко решить эту проблему с помощью собственного кода очень эффективным способом. Нет необходимости в CVXOPT.
Рой

Ответы:

11

Я написал полный ответ (ниже строки), прежде чем обнаружил CVXPY , который (как и CVX для MATLAB) делает всю сложную работу за вас и имеет очень короткий пример, почти идентичный вашему здесь . Вам нужно только заменить соответствующую строку на

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

Мой старый ответ, делать это сложнее с CVXOPT:

Следуя предложению Джеффа возвести в квадрат вашу целевую функцию,

Axb22=xTATbT,Axb=xTATAxbTAxxTAbbTb

Конечно, все термины являются скалярами, так что вы можете транспонировать третий и отбросить последний (так как он не зависит от и, следовательно, не изменится, какой дает вам минимум, хотя вам нужно будет добавить его обратно в после решения, чтобы получить правильное значение вашей цели), чтобы получить Это (включая ваши ограничения) имеет форму квадратичной программы, как указано в документация CVXOPT здесь , где также есть пример кода для решения такой проблемы.xx

xTATAxbT(A+AT)x
Дэвид Кетчесон
источник
4

Вместо того, чтобы решить проблему, решите

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

Эта проблема представляет собой дифференцируемую выпуклую нелинейную задачу оптимизации, которая может быть решена в CVXOPT, IPOPT или любом другом решении выпуклой оптимизации.

Джефф Оксберри
источник