Resolver un problema de mínimos cuadrados con restricciones lineales en Python

12

Necesito resolver

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

Yo creo que es un problema de segundo grado que debe ser solucionable con CVXOPT , pero no puedo encontrar la manera.

tillsten
fuente
Espero que esta pregunta no sea demasiado específica para compsci.
tillsten
Geoff Oxberry: Solo una curiosidad, pero ¿por qué editaste la parte lineal? Creo que es una parte bastante impotente de la descripción del problema, la solución sería bastante diferente para una optimización de mínimos cuadrados no lineal.
tillsten
Por cierto, las otras ediciones son geniales!
tillsten
Puede resolver esto fácilmente con su propio código de manera muy eficiente. No hay necesidad de CVXOPT.
Royi

Respuestas:

11

Escribí una respuesta completa (debajo de la línea) antes de descubrir CVXPY , que (como CVX para MATLAB) hace todo lo difícil por usted y tiene un ejemplo muy breve casi idéntico al suyo aquí . Solo necesita reemplazar la línea relevante con

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

Mi vieja respuesta, haciéndolo de la manera más difícil con CVXOPT:

Siguiendo la sugerencia de Geoff para cuadrar su función objetivo da

Axb22=xTATbT,Axb=xTATAxbTAxxTAbbTb

Por supuesto, todos los términos son escalares, por lo que puede transponer el tercero y soltar el último (ya que no depende de y, por lo tanto, no cambiará qué le da un mínimo, aunque deberá volver a agregarlo) después de resolver para obtener el valor correcto de su objetivo) para obtener Esto (incluidas sus restricciones) tiene la forma de un programa cuadrático, como se indica en la documentación de CVXOPT aquí , donde también hay un código de ejemplo para resolver dicho problema.xx

xTATAxbT(A+AT)x
David Ketcheson
fuente
4

En lugar del problema que resolvió, resuelva

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

Este problema es un problema de optimización diferenciable, convexo y no lineal que se puede resolver en CVXOPT, IPOPT o cualquier otro solucionador de optimización convexo.

Geoff Oxberry
fuente