2010-06-10 20 views
7

This great SO answer wskazuje na dobrą rozrzedzony solver dla Ax=b, ale mam ograniczenia na x taki sposób, że każdy element w x jest >=0<=N.Rzadkie ograniczane liniowych najmniejszych kwadratów Solver

Ponadto, A jest ogromny (około 2e6x2e6), ale bardzo rzadki z <=4 elementów w rzędzie.

Wszelkie pomysły/rekomendacje? Szukam czegoś takiego jak MATLAB's lsqlin, ale z ogromnymi rzadkimi matrycami.

jestem zasadniczo próbuje rozwiązać dużą skalę bounded variable least squares problem na macierzach rzadkich:

alt text

EDIT: W CVX:

cvx_begin 
    variable x(n) 
    minimize(norm(A*x-b)); 
    subject to 
     x <= N; 
     x >= 0; 
cvx_end 
+0

Co jest nie tak z użyciem tego konkretnego rozwiązania? Czy to nie jest wydajność, czy też szukasz rzeczy, o których należy pamiętać przed wdrożeniem rozwiązania? – jcolebrand

+0

Chciałbym egzekwować te ograniczenia, o których wspomniałem. – Jacob

+0

Może nie rozumiem problemu, czy ograniczenia nie są egzekwowalne w tym systemie? Która część pokazuje problem? Jak sądzisz, gdzie powinny obowiązywać ograniczenia? Wygląda na to, że solver został zaimplementowany w BOOST, co oznacza, że ​​naprawdę skupiałbyś się na wymyśleniu zmodyfikowanej biblioteki BOOST, nie? Przepraszam, wiem, że nie pomagam, ale to interesujący problem. – jcolebrand

Odpowiedz

3

Próbujesz rozwiązać najmniejsze kwadraty z ograniczeniami pola. Standardowe algorytmy rzadkich najmniejszych kwadratów obejmują LSQR, a ostatnio LSMR. Wymagają tylko zastosowania produktów matrycowo-wektorowych. Aby dodać ograniczenia, zdaj sobie sprawę, że jeśli znajdujesz się we wnętrzu pudełka (żadne z ograniczeń nie jest "aktywne"), to kontynuuj wybraną metodę punktu wewnętrznego. Dla wszystkich aktywnych więzów, następna iteracja, którą wykonasz, albo dezaktywuje ograniczenie, albo zmusza cię do poruszania się wzdłuż hiperpłaszczyzny więzów. W przypadku niektórych (z założenia względnie prostych) odpowiednich modyfikacji wybranego algorytmu można wdrożyć te ograniczenia.

Generalnie można jednak użyć dowolnego pakietu optymalizacji wypukłej. Osobiście rozwiązałem ten dokładny typ problemu za pomocą pakietu Matlab CVX, który używa SDPT3/SeDuMi dla zaplecza. CVX jest jedynie bardzo wygodnym opakowaniem wokół tych półpełnych programów solverów.

+0

Tak, zdaję sobie sprawę, że jest wypukły. Próbowałem CVX, ale zabrakło mu pamięci. Ponieważ zalecono CVX, opublikowaliśmy moje rozwiązanie CVX. – Jacob

+0

Jak duże były twoje matryce? – Jacob

+0

Użyłem małych gęstych matryc (około 100x100). Używasz rzadkich macierzy w Matlab, prawda? Uważam, że nie powinno zabraknąć pamięci, jeśli użyjesz spconvert() do skonstruowania macierzy. –

1

Twój macierzy A^TA jest dodatnia na wpół określony, więc twój problem jest wypukły; pamiętaj, aby skorzystać z tego podczas konfigurowania solwera.

Większość osób, które zdecydowały się na rozwiązanie QP, znajdują się w języku Fortran i/lub non-free; jednak słyszałem dobre rzeczy o OOQP (http://www.mcs.anl.gov/research/projects/otc/Tools/OOQP/OoqpRequestForm.html), choć trochę bólu dostaje kopię.

+0

Tak, próbowałem rozwiązać również formę kwadratową ('quadprog'), ale jest zbyt duży. Przyjrzę się OOQP i mam nadzieję, że działa dla rzadkich macierzy. – Jacob

3

Problemu jest podobny do nieujemne najmniejszych kwadratów problemu (NNLS), który może być formułowany jako

$$ \ min_x || Ax b || _2^2 \ tekście {zastrzeżeniem} x \ ge 0 $$,

dla których istnieje wiele algorytmów.

W zasadzie problem może zostać mniej lub bardziej przekonwertowany na problem NNLS, jeśli oprócz oryginalnych zmiennych nieujemnych $ x $ tworzysz dodatkowe zmienne $ x '$ i łącz je z ograniczeniami liniowymi $ x_i + x_i' = N $. Problem z tym podejściem polega na tym, że te dodatkowe ograniczenia liniowe mogą nie być spełnione dokładnie w rozwiązaniu najmniejszych kwadratów - może wtedy być właściwe, aby je obciążyć dużą liczbą.

+0

Czy możesz rozwinąć ten temat? – Jacob

+1

Problem NNSL, który jest bliski, ale nie jest to dokładnie twój problem, można na przykład rozwiązać za pomocą procedury MATLAB lsqnonneg.m W rzeczywistości narzędzie optymalizacji zawiera procedurę lsqlin.m, która może dokładnie rozwiązać problem, a nawet oferuje " wielkoskalowy algorytm "; może mógłbyś przetestować to na twojej matrycy? – Fanfan

+0

Inne zestawy narzędzi warte wypróbowania: TSNNLS (Cantarella i inni) dla NNLS i SLS (autor: Adlers i in.) Za problem – Fanfan

0

Co z CVXOPT?Współpracuje z nielicznych matryc, i wydaje się, że niektóre z rozwiązują programowania stożek może pomóc:

http://abel.ee.ucla.edu/cvxopt/userguide/coneprog.html#quadratic-cone-programs

Jest to prosta modyfikacja kodu w dokumencie powyżej, aby rozwiązać swój problem:

from cvxopt import matrix, solvers 
A = matrix([ [ .3, -.4, -.2, -.4, 1.3 ], 
      [ .6, 1.2, -1.7, .3, -.3 ], 
      [-.3, .0, .6, -1.2, -2.0 ] ]) 
b = matrix([ 1.5, .0, -1.2, -.7, .0]) 
N = 2; 
m, n = A.size 
I = matrix(0.0, (n,n)) 
I[::n+1] = 1.0 
G = matrix([-I, I]) 
h = matrix(n*[0.0] + n*[N]) 
print G 
print h 
dims = {'l': n, 'q': [n+1], 's': []} 
x = solvers.coneqp(A.T*A, -A.T*b, G, h)['x']#, dims)['x'] 
print x 

CVXOPT obsługuje rzadkie macierze, więc może być użyteczne dla ciebie.

1

Jeśli masz Matlaba, to jest coś, co możesz zrobić z TFOCS. Jest to składnia byłoby użyć do rozwiązania problemu:

x = tfocs(smooth_quad, { A, -b }, proj_box(0, N)); 

można przekazać jako uchwyt funkcji, jeśli jest zbyt duży, aby zmieścić się w pamięci.

1

Jeśli przeformułować swój model jako:

min
zastrzeżeniem:

to jest to norma kwadratowa problemem programowania. Jest to popularny typ modelu, który można łatwo rozwiązać za pomocą komercyjnego rozwiązania, takiego jak CPLEX lub Gurobi. (Zrzeczenie się: obecnie pracuję dla optymalizacji Gurobi i wcześniej pracowałem dla ILOG, który dostarczył CPLEX).

+0

Powinienem dodać: zmienne y nie są absolutnie konieczne. Możesz rozszerzyć cel i zastąpić zmienne y. Dodanie zmiennych y sprawia, że ​​model i kod są łatwiejsze do napisania i zrozumienia, i nie spowodują, że model będzie trudniejszy do rozwiązania. –