Programowanie liniowe z ograniczeniami macierzowymi


10

Mam problem z optymalizacją, który wygląda następująco

minJ,Bij|Jij|s.t.MJ+BY=X

Tutaj moje zmienne są macierzami J i B , ale cały problem jest nadal programem liniowym; pozostałe zmienne są ustalone.

Kiedy próbuję wprowadzić ten program do moich ulubionych narzędzi do programowania liniowego, mam problemy. Mianowicie, jeśli napiszę to w „standardowej” liniowej formie programu, macierze parametrów M i Y zostaną Ypowtórzone tonę razy (raz dla każdej kolumny X ).

Czy istnieje algorytm i / lub pakiet, który radzi sobie z optymalizacjami powyższego formularza? W tej chwili brakuje mi pamięci, ponieważ M i Y muszą być kopiowane tyle razy!


Czy B jest macierzą parametrów, czy masz na myśli Y ? Jakie są kształty różnych matryc?
Geoffrey Irving

[Cześć Geoffrey!] J i B to zmienne, reszta to parametry. B ma stosunkowo niewiele kolumn, ale wszystkie pozostałe wymiary są dość duże (nic nie jest kwadratowe).
Justin Solomon

[Cześć!] Powinieneś edytować post, aby nie powiedzieć dwukrotnie, że B jest parametrem.
Geoffrey Irving

1
Co ciekawe, ale prawdopodobnie bezużyteczne, wersja tego problemu z zamiastmożna rozwiązać za pomocą kilku SVD. Jij2|Jij|
Geoffrey Irving

1
@Geoffrey, to nie przypadek :-)
Justin Solomon

Odpowiedzi:


12

Przegląd

Możesz wypróbować wariant metody mnożników alternatywnych kierunków (ADMM), która okazała się zaskakująco szybko problemów typu lasso . Strategia polega na sformułowaniu problemu za pomocą rozszerzonego Lagrangianu, a następnie przejściu gradientem na podwójny problem. Jest to szczególnie miłe w przypadku tego konkretnego problemu z regulacją ponieważ niepłaska część każdej iteracji metody ma dokładne rozwiązanie, które można po prostu ocenić element po elemencie, podczas gdy część gładka wymaga rozwiązania układu liniowego.l1l1

W tym poście my

  • uzyskaj ogólną formułę ADMM w celu uogólnienia problemu,
  • wyłapać podproblemy dla każdej iteracji ADMM i specjalizować je w swojej sytuacji, a następnie
  • zbadania wynikowego układ liniowy, który musi być rozwiązany w każdej iteracji oraz opracowania szybkiego solver (lub przygotowującym) w oparciu o precomputing dekompozycji wartości własnej (lub niskich przybliżeń rangi ich) dla i .MTMYYT
  • podsumuj kilkoma uwagami końcowymi

Większość wielkich pomysłów tutaj omówiono w następującym znakomitym artykule przeglądowym,

Boyd, Stephen i in. „Optymalizacja rozproszona i uczenie statystyczne za pomocą metody mnożników zmiennego kierunku”. Podstawy i trendy® w uczeniu maszynowym 3.1 (2011): 1-122. http://www.stanford.edu/~boyd/papers/pdf/admm_distr_stats.pdf

Zanim przejdę do szczegółów, chcę zauważyć, że jest to odpowiedź na metodę / algorytm, a nie praktyczna odpowiedź na istniejący kod - jeśli chcesz skorzystać z tej metody, musisz rzucić własną implementację.

Preparat ADMM

Ogólnie załóżmy, że chcesz rozwiązać

minxi|xi|s.t.Ax=b.

Problem z oryginalnym postem należy do tej kategorii po odpowiedniej wektoryzacji. (jest to tylko w zasadzie - zobaczymy, że wektoryzacja nie musi być wykonywana w praktyce)

Zamiast tego możesz rozwiązać równoważny problem, który ma Lagrangian

minx,zi|xi|+α2||xz||2+β2||Azb||2s.t.Az=b&x=z,
L(x,z,λ,γ)=i|xi|+α2||xz||2+β2||Azb||2+λT(Azb)+γT(xz)=i|xi|+α2||xz+1αγ||2+β2||Azb+1βλ||2+α2||1αγ||2+β2||1βλ||2.

Metoda mnożników w naprzemiennym kierunku rozwiązuje podwójny problem, poprzez wznoszenie gradientu na podwójnych zmiennych, z wyjątkiem niedokładne naprzemienne wyświetlanie podwójnych podproblemów. Tj. się iterację

maxλ,γminx,zL(x,z,λ,γ),
xk+1=argminxL(x,zk,λk,γk)zk+1=argminzL(xk+1,z,λk,γk)γk+1=γk+α(xk+1zk+1)λk+1=λk+β(Azk+1b).

W pewnych łagodnych warunkach dla parametrów i (wyjaśnionych w powiązanym powyżej dokumencie Boyda i Parikha) metoda ADMM zbiegnie się z prawdziwym rozwiązaniem. Współczynnik zbieżności jest liniowy, ponieważ stanowi rdzeń metody wynurzania gradientowego. Często można go przyspieszyć, aby był superliniowy, 1) zmieniając parametry i miarę przechodzenia na podstawie heurystyki lub 2) stosując przyspieszenie Nesterowa. Uwagi na temat zmiany parametrów kary znajdują się w artykule z ankietą Boyda, a na temat korzystania z przyspieszenia Niestierowa z ADMM patrz następujący artykuł:αβαβ

Goldstein, Tom, Brendan O'Donoghue i Simon Setzer. „Szybkie metody optymalizacji naprzemiennego kierunku”. Raport CAM (2012): 12–35. ftp://ftp.math.ucla.edu/pub/camreport/cam12-35.pdf

Jednak nawet jeśli ogólny wskaźnik zbieżności jest tylko liniowy, w przypadku problemów z zaobserwowano metodę bardzo szybkiego znajdowania wzoru rzadkości, a następnie zbiegania się wolniej na dokładnych wartościach. Ponieważ znalezienie wzoru rzadkości jest najtrudniejszą częścią, jest to bardzo przypadkowe! Dokładne powody, dla których wydają się być obszarem obecnych badań. Wszyscy widzą, że wzór rzadkości zbiega się szybko, ale wydaje się, że nikt nie wie dokładnie, dlaczego tak się dzieje. Jakiś czas temu zapytałem o to Boyda i Parikha, a Parikh pomyślał, że można to wyjaśnić, interpretując metodę w kontekście systemów sterowania. Inne heurystyczne wyjaśnienie tego zjawiska znajduje się w załączniku do następującego artykułu:l1

Goldstein, Tom i Stanley Osher. „Podzielona metoda Bregmana dla problemów regulowanych przez L1”. SIAM Journal on Imaging Sciences 2.2 (2009): 323-343. ftp://ftp.math.ucla.edu/pub/camreport/cam08-29.pdf

Oczywiście teraz leży trudność w rozwiązywaniu i aktualizacji podproblemów do sytuacji konkretnego. Ponieważ Lagrangian jest kwadratowy w , podproblem aktualizacji wymaga po prostu rozwiązania układu liniowego. subproblem wydaje się trudniejsze, ponieważ jest nondifferentiable, ale okazuje się, że istnieje dokładny wzór na rozwiązanie, które można zastosować element po elemencie! Teraz omawiamy te podproblemy bardziej szczegółowo i określamy je dla problemu w oryginalnym poście.xzzzx

Konfiguracja podproblemu aktualizacji (system liniowy)z

Do aktualizacji mamy z

argminzL(xk,z,λk,γk)=argminzα2||xz+1αγ||2+β2||Azb+1βλ||2.

Specjalizuje się w tym problemie:

argminZJ,ZBα2||Jk+1ZJ+1αΓJ||Fro2+α2||Bk+1ZB+1αΓB||Fro2+β2||MZJ+ZBYX+1αΛ||Fro2,

gdzie oznacza normę Frobenius (elementwise ). Jest to kwadratowy problem minimalizacji, w którym warunki optymalności pierwszego rzędu można znaleźć, biorąc częściowe pochodne celu w odniesieniu do i i ustawiając je na zero. To jest, ||||Frol2ZJZB

0=α2(Jk+1ZJ+1αΓJ)+β2MT(MZJ+ZBYX+1βΛ),0=α2(Bk+1ZB+1αΓB)+β2(MZJ+ZBYX+1βΛ)YT.

Jak zauważono w komentarzach oryginalnego plakatu Justina Solomona, ten system dla jest symetryczny, więc gradient sprzężony jest idealną metodą bez matrycy. W dalszej części bardziej szczegółowo omówiono ten system i sposób jego rozwiązania / warunku wstępnego.ZJ,ZB

Rozwiązywanie problemu aktualizacja podproblemu (analityczne rozwiązanie progowania)x

Teraz do podproblemu , x

argminxL(x,zk,λk,γk)=argminxi|xi|+α2||xzk+1αγk||2

Pierwszą rzeczą do zobaczenia jest to, że suma może być podzielona element po elemencie,

i|xi|+α2||xzk+1αγk||2=i|xi|+α2i(xizik+1αγik)2,

Możemy więc rozwiązać problem optymalizacji element po elemencie równolegle, uzyskując

xik+1=argminxi|xi|+α2(xizik+1αγik)2.

Ogólna postać tego równania to

mins|s|+α2(st)2.

Funkcja wartości bezwzględnej próbuje przyciągnąć optymalny punkt w kierunku , podczas gdy człon kwadratowy próbuje przyciągnąć optymalny punkt w kierunku . prawdziwe rozwiązanie leży więc gdzieś na segmencie między nimi, ze zwiększeniem zmierzającym do przyciągnięcia optymalnego punktu w kierunku , a zmniejszeniem przyciągającym optymalny punkt w kierunku .s=0s=t[0,t)αtα0

Jest to funkcja wypukła, ale nie można jej odróżnić od zera. Warunkiem punktu minimalizującego jest to, że sub pochodna celu w tym punkcie zawiera zero. Kwadratowy składnik ma pochodną , a funkcja wartości bezwzględnej ma pochodną dla , pochodną o ustalonej wartości jako przedział gdy , i pochodną dla . W ten sposób otrzymujemy pochodną dla ogólnej funkcji celu, α(st)1s<0[1,1]s=01s>0

s(|s|+α2(st)2)={1+α(st)s>0[1,1]+αt,s=0,1+α(st),s<0.

Z tego widzimy, że pochodna celu przy zawiera wtedy i tylko wtedy, gdy , w którym to przypadku jest minimalizatorem. Z drugiej strony, jeśli nie jest minimalizatorem, wówczas możemy ustawić pochodną jednowartościową równą zero i rozwiązać dla minimalizatora. Wykonanie tego daje s=00|t|1αs=0s=0

argmins|s|+α2(st)2={t1α,t>1α,0,|t|1α,t+1α,t<1α

Specjalizując ten wynik ponownie w prawdziwym problemie, który próbujemy rozwiązać w pierwotnym pytaniu, gdzie daje, Aktualizacja dla to po prostu t=Zijk1αΓijk

Jijk+1={Zijk1αΓijk1α,Zijk1αΓijk>1α,0,|Zijk1αΓijk|1α,Zijk1αΓijk+1α,Zijk1αΓijk<1α.
B
Bk+1=ZB1αΓB,

jak zauważono w oryginalnym plakacie Justina Solomona w komentarzach. Ogólnie rzecz biorąc, wykonanie aktualizacji dla wymaga tylko zapętlenia wpisów macierzy i oceny powyższych wzorów dla każdego wpisu.J,B

Uzupełnienie schura dla systemuZJ,ZB

Najdroższym krokiem iteracji jest rozwiązanie systemu,

0=α2(Jk+1ZJ+1αΓJ)+β2MT(MZJ+ZBYX+1βΛ),0=α2(Bk+1ZB+1αΓB)+β2(MZJ+ZBYX+1βΛ)YT.

W tym celu warto trochę wysiłku skonstruować dobrego solvera / warunku wstępnego dla tego systemu. W tej sekcji robimy to poprzez wektoryzację , utworzenie dopełnienia Schur , wykonanie pewnych manipulacji produktem Krnoecker, a następnie cofnięcie wektoryzacji. Powstały układ dopełniacza Schura jest nieznacznie zmodyfikowanym równaniem Sylvester .

Poniższe dane dotyczące wektoryzacji i produktów Kronecker są absolutnie kluczowe:

  • vec(ABC)=(CTA)vec(B),
  • (AB)(CD)=ACBD ,
  • (AB)1=A1B1 , oraz
  • (AB)T=ATBT .

Tożsamości te zachowują się zawsze, gdy rozmiary macierzy i odwracalność są takie, że każda strona równania jest prawidłowym wyrażeniem.

Wektoryzowana forma systemu to:

(αI+β[IMTM(YM)TYMYYTI])[vec(ZJ)vec(ZB)]=[vec(αJ+βMTX+ΓJMTΛ)vec(αB+βXYT+ΓBΛYT)],

lub

[I(αI+βMTM)β(YM)TβYM(αI+βYYT)I][vec(ZJ)vec(ZB)]=[vec(F)vec(G)],

gdzie i są skróconą notacją dla prawej strony. Teraz przeprowadzamy eliminację bloku-gaussa / eliminację Schura, aby wyeliminować lewy dolny blok matrycy w procesie kondensacji produktów Kroneckera. To jest, FG

[I(αI+βMTM)β(YM)T0(αI+βYYT)Iβ2YYTM(αI+βMTM)1MT][vec(ZJ)vec(ZB)]=[vec(F)vec(G)βYM(αI+βMTM)1vec(F)].

Bez wektorowania dwa równania, które musimy rozwiązać kolejno, to:

  1. ZB(αI+βYYT)(βM(αI+βMTM)1MT)ZB(βYYT)=GβM(αI+βMTM)1FYT
  2. (αI+βMTM)ZJ=FβMTZBY.

Rozwiązanie układu dopełniacza Schur, gdy są kwadratowe, mają wysoką rangęY,M

W tej sekcji rozwiązujemy układ dopełniacza Schura dla (równanie 1. powyżej), stosując wstępnie obliczone pełne SVD macierzy i stosując zmodyfikowaną wersję algorytmu Bartelsa-Stewarta dla Sylvester równanie. Algorytm został nieco zmodyfikowany w stosunku do standardowej wersji, aby uwzględnić dodatkowy w drugim członie, co sprawia, że ​​nie jest to równanie Sylvester. Po za pomocą pierwszego równania, można łatwo znaleźć z drugiego równania. Drugie równanie jest łatwe do rozwiązania za pomocą dowolnej metody.ZBYYT,MMT,MTMβYYTZBZJ

Ta metoda wymaga wstępnego obliczenia dwóch pełnych plików SVD przed rozpoczęciem procesu ADMM, ale szybko można ją zastosować w rzeczywistych iteracjach ADMM. Ponieważ metoda dotyczy pełnych SVD macierzy więzów, właściwe jest, gdy są one zbliżone do kwadratu i wysokiej rangi. Możliwa jest również bardziej skomplikowana metoda wykorzystująca SVD niskiej rangi, ale została przedstawiona w dalszej części.

Metoda rozwija się w następujący sposób. Niech oznaczają Precomputed pełne dekompozycje wartości pojedyncze, i skroplenia prawą stronę za . Wtedy pierwszym równaniem jest: Mnożenie przez czynniki ortogonalne, aby wyczyścić lewą i prawą stronę i ustawić nowy tymczasowy nieznany , to dalej staje się,

QDQT=YYT,WΣWT=MMT,VTVT=MTM
H
ZBQ(αI+D)QTWβΣ(αI+Σ)1ΣWTZBQDQT=H.
A=WTZBQ
A(αI+D)βΣ(αI+Σ)1ΣAD=WHQT.

Teraz możemy znaleźć , rozwiązując układ diagonalny , A

((αI+D)I+DβΣ(αI+Σ)1Σ)vec(A)=vec(WHQT).

Po znalezieniu obliczamy i znając rozwiązujemy drugie równanie powyżej dla , co jest trywialne, ponieważ mamy już rozkład wartości własnej dla .AZB=WAQTZBZJMTM

Koszt początkowy polega na obliczeniu dwóch symetrycznych dodatnich określonych wartości własnych i , a następnie koszt za iterację dla pełnego rozwiązania jest zdominowany przez garstkę mnożenia macierzy-macierzy, która jest tego samego rzędu wielkość jako wykonanie 1 podrzędności CG. Jeśli początkowe dekompozycje wartości własnych są zbyt kosztowne, można je obliczyć niedokładnie, na przykład przez wcześniejsze zakończenie iteracji Lanczosa i utrzymanie największych wektorów własnych. Następnie metodę tę można zastosować jako dobry warunek wstępny dla CG, a nie jako bezpośredni solver.MTMYYT

Metoda rozwiązania, gdy są bardzo prostokątne lub mają przybliżenie niskiej rangiM,Y

Teraz zwracamy uwagę na rozwiązywanie lub kondycjonowanie gdy albo a) macierze wejściowe są bardzo prostokątne - co oznacza, że ​​mają znacznie więcej wierszy niż kolumn lub odwrotnie - lub b) mają przybliżenie niskiej rangi. Poniższe wyprowadzenie obejmuje szerokie zastosowanie formuły Woodbury'ego, uzupełnienia Schura i innych podobnych manipulacji.ZJ,ZBM,Y

Zaczynamy od naszego systemu uzupełniającego Schur,

(αI+βYYT)Iβ2YYTM(αI+βMTM)1MT.

Kilka manipulacji przekształca ten system w bardziej symetryczną formę,

(αI+βIMMT+βYYTI)vec(ZB)=(I(I+βαMMT))vec(H).

Teraz przybliżamy niskie rangi. Niech będzie przybliżonym zmniejszeniem SVD lub przybliżeniem niskiego stopnia i ( jest symbolem zastępczym i nie jest używany). Podstawienie ich do naszego układu daje następującą macierz odwrotną, którą chcemy zastosować,

QD1/2Q2T=YWΣ1/2VT=M
YMQ2
(αI+βIWΣWT+βYYTI)1.

Ponieważ macierz, którą mamy do odwrócenia, jest aktualizacją tożsamości niskiej rangi, logiczną strategią jest próba użycia formuły Woodbury'ego

(A+UCUT)1=A1A1U(C1+UTA1U)1UTA1.

Jednak należy zachować ostrożność, ponieważ elementy niskiej rangi i nie są ortogonalne. Tak więc, aby zastosować formułę Woodbury, zbieramy zarówno aktualizacje niskiej rangi w jedną dużą aktualizację. Zrób to i stosując formułę Woodbury, IWYI

(1αI+β[IWQI][IΣDY][IΣTQTI])1=αIβα2[IWQI][I(Σ1+βαI)βαQWTβαQTW(D1+βαI)Y]1[IΣTQTI].

Odwrotność rdzenia można obliczyć według odwrotnej formuły odwrotnej 2x2,

[ABBTC]1=[(ABC1BT)1A1B(CBTA1B)1C1BT(ABC1BT)1(CBTA1B)1].

Ten post jest już wystarczająco długi, więc oszczędzę obszernych szczegółów obliczeń, ale efekt końcowy jest taki, że podłączenie niezbędnych podmacierzy do odwrotnego bloku i pomnożenie wszystkiego przez to daje następującą jawną formę dla ogólnego odwrotności,

(αI+βIMMT+βYYTI)1=1αIβα2(t11+s11+t12+s12+t21+s21+t22+s22),

gdzie

t11=αβIWl1WTs11=(QWl1)D11(QTl1WT)t12=αβQh1QTWl1WTs12=(Qh1Wl1)D22(h1QTWT)t21=t12s21=(Qh1W)D22(h1QTl1WT)t22=αβQh1QTIs22=(Qh1W)D22(h1QTWT)D11=αβ(hIIl1)1D22=αβ(Ilh1I)1l=αβΣ1+Ih=αβD1+I.

W tej formie możemy zastosować odwrotność i znaleźć po semestrze przez 8 lewych i prawych kanapek mnożenia macierzy. Ogólna formuła stosowania sumy produktów Kronecker to: ZB

((A1B1)+(A2B2)+)vec(C)=vec(B1TCA1+B2TCA2+).

Zauważ, że wszystkie jawne odwrotności, na których się skończyliśmy, są ukośne, więc nie ma nic do „rozwiązania”.

Liniowy kod solvera

W Matlabie zaimplementowałem powyższe dwa . Wydaje się, że działa dobrze. Kod solvera jest tutaj.zJ,ZB

https://github.com/NickAlger/MeshADMM/blob/master/zkronsolve.m

Skrypt testowy do sprawdzania działania solverów jest tutaj. Pokazuje również przykładowo, jak wywołać kod solvera.

https://github.com/NickAlger/MeshADMM/blob/master/test_zkronsolve.m

Uwagi końcowe

Metody typu ADMM dobrze nadają się do takich problemów, ale konieczne byłoby wdrożenie własnej implementacji. Ogólna struktura metody jest dość prosta, więc implementacja nie jest zbyt trudna w czymś takim jak MATLAB.

Brakującym elementem tego postu, który należałoby określić, aby w pełni zdefiniować metodę problemu, jest wybór parametrów karnych . Na szczęście metoda jest ogólnie dość solidna, o ile wartości parametrów nie są szalone. W artykule Boyda i Parikha znajduje się sekcja o parametrach karnych, podobnie jak odniesienia do nich, ale po prostu eksperymentowałbym z tymi parametrami, aż uzyskasz rozsądne wskaźniki zbieżności.α,β

Przedstawione strategie solvera są wysoce skuteczne, jeśli macierze ograniczeń są albo a) gęste, kwadratowe i mają wysoką rangę, albo b) mają dobre przybliżenie niskiej rangi. Inną użyteczną Solver które mogą być temat pracy przyszłości będzie Solver zoptymalizowane w następnym przypadku - matryca ograniczenie jest niewielkie i squareish i wysoki stopień, ale istnieje dobra prekondycjonerze do . Byłoby tak, gdyby na przykład był zdyskretowanym Laplacianinem.ZJ,ZBMαI+MMTM


Wdrażanie tego teraz! Aby sprawdzić, rozwiązanie macierzy dla i powinno być określone symetrycznie / dodatnio, ponieważ pochodzi z najmniejszych kwadratów, prawda? To empirycznie wydaje się prawdą :-). Czy więc CG jest lepszą opcją niż GMRES? ZBZJ
Justin Solomon

Myślę też, że aktualizacja B jest nieprawidłowa? Pracuję nad tym bardziej szczegółowo, ale przypominam, że B nie pojawia się w mojej funkcji energetycznej (brak term), więc nie jestem pewien, czy powinien przyjmować wartości tylko w Czy myślę o tym źle? Dzięki! |B|±(11/α).
Justin Solomon

1
[raczej, ]B=ZBΓB/α
Justin Solomon

3
Niesamowity! Po wprowadzeniu własnych formuł dla i (prawdopodobnie bliskie / równoważne z tym, co opublikowałeś, ale coś nie działało), jest to znacznie lepsze niż metoda IRLS. Dzięki! JB
Justin Solomon

1
Dobre wieści. Tak miło widzieć, kiedy wkład tutaj prowadzi do prawdziwych rezultatów.
Michael Grant,

5

Prawdopodobnie chcesz użyć metody bez matrycy do programowania liniowego. Nie znam żadnej metody ukierunkowanej na programowanie liniowe, ale istnieją metody macierzy wewnętrznych bez matrycy dla programów kwadratowych i ogólnie dla programów nieliniowych. Przypadek programu kwadratowego dokładnie odpowiada twojemu problemowi, gdzie wszystkie współczynniki postaci kwadratowej są zerami. (Można również dostosować metody wykorzystujące dokładne rozwiązania liniowe do struktury problemu, ale tego rodzaju indywidualne wdrożenie może nie być tego warte i jest mniej praktyczne niż stosowanie metody bez macierzy).

Nie znam żadnego komercyjnego pakietu optymalizacyjnego, który implementowałby wolne od matrycy warianty metod punktów wewnętrznych. IPOPT ma zaimplementować bez matrycową metodę punktu wewnętrznego dla programowania nieliniowego, ale nie byłem w stanie wyśledzić wywołań API, które umożliwiają jej użycie.

Oprócz CVX można prawdopodobnie użyć GAMS lub AMPL, aby wprowadzić macierz raz i skonfigurować ograniczenia w języku modelowania, aby używać tej macierzy. Jednak metody stosowane przez backendy solvera do CVX, GAMS i AMPL nie używają solverów bez macierzy; wszystko będzie wymagało pełnej macierzy współczynników dla programu liniowego w standardowej formie, która będzie ogromna (będzie to iloczyn macierzy Kroneckera). Prawdopodobnie stanie się tak, że wprowadzisz swój program liniowy w powyższej formie, używając języka modelowania, a następnie język modelowania przetłumaczy dane na formę używaną przez solwery zaplecza. Ten formularz będzie wymagał ogromnych matryc i podejrzewam, że napotkasz tego samego rodzaju błędy (chyba że uruchomisz na komputerze z wystarczającą ilością pamięci).


Wygląda na to, że próbowałem wszystkich właściwych rzeczy! Początkowo eksperymentowałem z CVX i to się nie udało, więc przełączyłem się na IPOPT. Ale IPOPT miał ten sam problem. Nie wiedziałem, że ma opcję bez matrycy, więc zobaczę, czy dam radę.
Justin Solomon

Nie jestem pewien, czy GAMS / AMPL pomoże mojemu problemowi. Z przyjemnością opisuję problem w dowolnej formie, aby pomóc solverowi zrobić właściwą rzecz, ale jak mówisz za kulisami, biorąc produkt Kronecker nie zadziała.
Justin Solomon

4

Czy stać cię na te SVD, o których wspomniał Geoffrey Irving? Jeśli możesz, rozważę iteracyjnie przeważone podejście metodą najmniejszych kwadratów (IRLS) . To podejście rozwiązałoby problemy z formą gdzie jest macierzą wag.

minimizeijWijJij2subject toMJ+BY=X
W

Iteracje zaczynają się od jako macierzy wszystkich; daje to optymalną . Iteracje następują od gdzie jest małą stałą, która zapobiega dzieleniu przez zero. Nie jestem całkowicie pewien kryteriów konwergencji, ale być może link do Wikipedii, który przedstawiłem powyżej, może zawierać odniesienia.W(0)J(0)

Wij(k+1)=|max{Jij(k),ϵ}|1
ϵ

Możesz również rozważyć wygładzoną metodę pierwszego rzędu. TFOCS, którego jestem współautorem, może sobie z tym poradzić, używając swojego „wygładzonego stożkowego podwójnego” solvera (SCD), ale nie będzie tak łatwy w użyciu.

Jeśli chcesz wypróbować macierzową metodę punktu wewnętrznego, przeczytaj pracę Jacka Gondzio.

EDYCJA: hmm, może się zdarzyć, że IRLS nie będzie mógł użyć SVD do obliczenia rozwiązań. Jeśli tak, wrócę do jednej z innych opcji.


1
Nie jestem pewien, czy mógłbym tutaj użyć SVD, ale IRLS to świetny pomysł, niezależnie od tego! Prędkość nie jest tak ważna, jak pamięć, i zawstydzająco użyłem IRLS do pokrewnych badań kilka miesięcy temu i zadziałało świetnie (kopiąc siebie za to, że nie próbowałem tego wcześniej!). Nawet bez SVD dla IRLS powinno być to możliwe przy użyciu solwera liniowego, takiego jak CG, który nie wymaga pełnego systemu. W rzeczywistości CG można prawdopodobnie zatrzymać za pomocą dość luźnych ograniczeń przed dostosowaniem jak sugerujesz. Patrząc również na podejście ADMM, ale mam z tym mniej doświadczenia. Wij
Justin Solomon

Tak, ADMM też byłoby świetne. Właściwie napisałem sekcję sugerującą całkowite wyeliminowanie Y, ale później zobaczyłem, że nie było kwadratowe. M
Michael Grant

1
Wdrożono strategię IRLS - jest zbieżna, ale liczbowo nie radzi sobie zbyt dobrze, ponieważ układ liniowy, który musi rozwiązać, jest źle uwarunkowany dzięki szerokiemu zakresowi ; za pomocą GMRES do rozwiązania systemu. Spróbuję ADMM w następnej kolejności! w
Justin Solomon

2

Możesz spróbować użyć CVX , który pozwoliłby ci zakodować go w dokładnie takiej formie, w jakiej go napisałeś (tj. Z jako matrycą, a nie z wektorem). Prawdopodobnie zostałby rozwiązany za pomocą bardziej ogólnego wypukłego solvera zamiast solvera LP, ale jeśli wypukły solver się powiedzie, to chyba nie masz nic przeciwko.X

Inna możliwość: użyj solvera, który pozwala na przechowywanie macierzy ograniczeń jako macierzy rzadkich. Będzie to nadal wymagało o wiele więcej pamięci niż to, co powinno być potrzebne, ale o wiele mniej niż w przypadku przechowywania ich jako gęstych matryc. Jeśli używasz CVX, kronotrzymujesz rzadką macierz, więc wypróbowanie tego byłoby trywialne.


Jeśli z jakiegokolwiek powodu Python byłby wygodniejszy niż MATLAB, istnieje również cvxpy, chociaż nie jest tak dopracowany jak cvx.
k20

Podejrzewam, że to podejście zadziała powierzchownie, a następnie zawiedzie po przekształceniu danych wejściowych w język modelowania CVX w formę używaną przez solwery zaplecza (które rozwiążą programy liniowe, programy kwadratowe, programy stożkowe drugiego rzędu, programy półfinałowe i programy geometryczne). Wyjaśniam dlaczego w mojej odpowiedzi. Backend Gurobi to najlepszy w swojej klasie solver LP (między innymi), więc używanie CVX z tym algorytmem jest prawdopodobnie najlepszym, co możesz zrobić pod względem implementacji, bez wywoływania CVX z API skompilowanego języka.
Geoff Oxberry

1
Jak mówi Geoff, żadna warstwa modelowania nie pomoże ci tutaj. Wynikowy LP ma dane powtórzone dla dowolnego standardowego generycznego solvera. Aby to obejść, będziesz musiał użyć (opracować) solvera opartego na wyroczni, tj. Solvera, który zasadniczo polega na zwróceniu resztkowego dla danej wartości i / lub niektórych odpowiednie cięcie, a następnie pracuj z tym opisem. MJ+BYXJ,Y
Johan Löfberg

Tak, mam dokładnie ten problem, o którym wspomina Geoff. W rzeczywistości użyłem CVX do wstępnego odgadnięcia. Próbowałem też zadzwonić bezpośrednio do Gurobi, ale jedyny sposób, w jaki mogę to zrobić, to zrobić ten sam problem z rozwijaniem.
Justin Solomon

1
Myślę, że będziesz musiał rzucić własny
Johan Löfberg
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.