Risolvere un problema dei minimi quadrati con vincoli lineari in Python


12

Ho bisogno di risolvere

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

Io penso che sia un problema di secondo grado che dovrebbe essere risolvibile con CVXOPT , ma non riesco a capire come.


Spero che questa domanda non sia troppo specifica per compsci.
tillsten,

Geoff Oxberry: solo una curiosità, ma perché hai modificato la parte lineare? Penso che sia una parte abbastanza impotente della descrizione del problema, la soluzione sarebbe abbastanza diversa per un'ottimizzazione dei minimi quadrati non lineari.
tillsten il

A proposito, le altre modifiche sono fantastiche!
tillsten il

Puoi risolverlo facilmente con il tuo codice in modo molto efficiente. Non è necessario CVXOPT.
Royi,

Risposte:


11

Ho scritto una risposta completa (sotto la riga) prima di scoprire CVXPY , che (come CVX per MATLAB) fa tutte le cose difficili per te e ha un esempio molto breve quasi identico al tuo qui . Devi solo sostituire la riga pertinente con

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

La mia vecchia risposta, facendolo nel modo più difficile con CVXOPT:

Seguendo il suggerimento di Geoff di quadrare la tua funzione oggettiva dà

Axb22=xTATbT,Axb=xTATAxbTAxxTAbbTb

Naturalmente, tutti i termini sono scalari, quindi puoi trasporre il terzo e rilasciare l'ultimo (poiché non dipende da e quindi non cambierà quale ti fornisce un minimo, anche se dovrai aggiungerlo di nuovo dopo aver risolto per ottenere il valore corretto del tuo obiettivo) per ottenere Questo (compresi i tuoi vincoli) ha la forma di un programma quadratico, come indicato in la documentazione CVXOPT qui , dove esiste anche un codice di esempio per risolvere un simile problema.xx

xTATAxbT(A+AT)x

4

Invece del problema che hai risolto, risolvi

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

Questo problema è un problema di ottimizzazione differenziabile, convesso, non lineare che può essere risolto in CVXOPT, IPOPT o qualsiasi altro risolutore di ottimizzazione convesso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.