Rozwiązywanie problemu najmniejszych kwadratów z ograniczeniami liniowymi w Pythonie

12

Muszę rozwiązać

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

Myślę , że to kwadratowy problem, który powinien być rozwiązany za pomocą CVXOPT , ale nie potrafię zrozumieć, jak to zrobić.

tillsten
źródło
Mam nadzieję, że to pytanie nie jest zbyt szczegółowe dla compsci.
tillsten
Geoff Oxberry: Ciekawostka, ale dlaczego edytowałeś część liniową? Myślę, że jest to dość bezsilna część opisu problemu, rozwiązanie byłoby zupełnie inne w przypadku nieliniowej optymalizacji metodą najmniejszych kwadratów.
tillsten
Przy okazji, inne zmiany są świetne!
tillsten
Możesz to łatwo rozwiązać za pomocą własnego kodu w bardzo wydajny sposób. Nie ma potrzeby CVXOPT.
Royi,

Odpowiedzi:

11

Napisałem pełną odpowiedź (poniżej linii) przed odkryciem CVXPY , który (podobnie jak CVX dla MATLAB) robi dla ciebie wszystkie trudne rzeczy i ma bardzo krótki przykład prawie identyczny z twoim tutaj . Trzeba tylko zastąpić odpowiednią linię

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

Moja stara odpowiedź: robić to trudniej z CVXOPT:

Podążając za sugestią Geoffa, aby wyrównać, daje się funkcja celu

Axb22=xTATbT,Axb=xTATAxbTAxxTAbbTb

Oczywiście wszystkie terminy są skalarne, więc możesz transponować trzeci i upuścić ostatni (ponieważ nie zależy to od a zatem nie zmieni się, co daje ci minimum, chociaż będziesz musiał go dodać z powrotem in po rozwiązaniu w celu uzyskania prawidłowej wartości celu), aby uzyskać To (wraz z ograniczeniami) ma postać programu kwadratowego, jak podano w dokumentacja CVXOPT tutaj , w której znajduje się również przykładowy kod do rozwiązania takiego problemu.xx

xTATAxbT(A+AT)x
David Ketcheson
źródło
4

Zamiast problemu, który rozwiązałeś, rozwiąż

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

Ten problem jest rozróżnialnym, wypukłym, nieliniowym problemem optymalizacji, który można rozwiązać w CVXOPT, IPOPT lub dowolnym innym wypukłym rozwiązaniu optymalizacyjnym.

Geoff Oxberry
źródło