Kérdés:
Milyen gyors algoritmusok léteznek a csonka SVD kiszámításához?
John Doucette
2015-06-30 20:41:25 UTC
view on stackexchange narkive permalink

Lehet, hogy itt nincsenek témák, de már létezik több ( egy, kettő) kérdés.

Az irodalomban (vagy a Google keresése a csonka SVD algoritmusokra való keresés) sok olyan papír jelenik meg, amelyek különféle módon használnak csonkolt SVD-ket, és igényelnek (frusztrálóan, gyakran idézés nélkül), hogy vannak gyors algoritmusok a kiszámításához, de úgy tűnik, senki sem mutat rá, hogy mik ezek az algoritmusok.

Az egyetlen dolog, amit találok, egyetlen randomizált algoritmus, amelyet a redSVD könyvtárban használnak.

Amit szeretnék látni, az egy sor pontos és pontatlan algoritmus, amely alkalmas a rendszerek működésének megértésére. (de természetesen nem feltétlenül a tényleges megvalósításhoz!).

Van valakinek jó referenciája az ilyesmire?

Ha jól akarok adatokat tárolni, akkor a hash-ban egy b-fát (vagy rb-fát) használok (gondoljunk csak a ramra).Ha lenne egy b-fám az adatokhoz, akkor O (log (n)) időmintában kvantilokat és hasonlókat tehetnék.Fogadok, hogy nagy adatok mellett egy ilyen mintavétel segítségével rövid idő alatt kiszámítható lenne egy tisztességes ritka közelítés az svd mátrixokhoz.Megtekintheti a "tömörített érzékelést" is, ami nagyon statisztikai megközelítés az extrém adattömörítéshez.
Csonka SVD alatt azt érted, hogy csak több vezető egyes számú vektor / érték megtalálása érdekel, szemben mindezekkel?
@amoeba Igen, ez az ötlet.
Három válaszokat:
amoeba
2015-07-02 15:16:51 UTC
view on stackexchange narkive permalink

Nagyon tág értelemben két megközelítés létezik a sajátérték vagy az egyes értékek lebontásának kiszámításához. Az egyik megközelítés a mátrix átlósítása, és ez lényegében a teljes sajátérték / egyesérték-bontást (a teljes sajátérték-spektrumot) eredményezi egyidejűleg, itt olvashat néhány áttekintést: Melyek a hatékony algoritmusok az egyesérték-bomlás (SVD) kiszámításához? Alternatív megoldásként olyan iteratív algoritmust használhat, amely egyszerre egy (vagy több) sajátvektort eredményez. Az iterációk a kívánt számú sajátvektor kiszámítása után leállíthatók.

Nem hiszem, hogy léteznének iteratív algoritmusok kifejezetten az SVD számára. Ennek az az oka, hogy kiszámítható egy $ n \ szorzat m $ mátrix SVD értéke $ \ mathbf B $ egy négyzet szimmetrikus $ (n + m) \ szorzat (n + m) $ mátrix eigendakompozíciójával $ mátrix $$ \ mathbf A = \ left (\ begin {array} {cc} 0 & \ mathbf B \\\ mathbf B ^ \ top & 0 \ end {array} \ right). $$ azt kérdezi, hogy milyen iteratív algoritmusok számolják az eigendekompozíciót: $$ \ text {algoritmus csonka SVD-hez} \ kb \ text {iteratív algoritmus eigendecompositionhoz. a> és valóban nagyon egyszerű:

  1. Inicializálja a véletlenszerű $ \ mathbf x $ értéket.
  2. Frissítse a $ \ mathbf x \ get \ mathbf A \ mathbf x $ értéket.
  3. Normalizálja a $ \ mathbf x \ get \ mathbf x / \ | \ mathbf x \ | $ értékeket.
  4. Ugrás a 2. lépésre, hacsak nem konvergál.

A bonyolultabb algoritmusok végső soron a teljesítmény iterációs ötleten alapulnak, de meglehetősen kifinomultak. A szükséges matematikát a Krylov alterek adják meg. Az algoritmusok Arnoldi iterációja (négyzet alakú nem szimmetrikus mátrixok esetén), Lanczos iteráció (négyzet alakú szimmetrikus mátrixok esetében), és ezek variációi, például pl. "implicit módon újraindította a Lanczos-módszert" és mi más.

Ezt megtalálhatja pl. a következő tankönyvek:

  1. Golub & Van Loan, Matrix Computations
  2. Trefethen & Bau, numerikus lineáris algebra
  3. Demmel, alkalmazott numerikus lineáris algebra
  4. Saad, numerikus Módszerek nagy sajátérték-problémákra

Minden ésszerű programozási nyelv és statisztikai csomag (Matlab, R, Python numpy, Ön megnevezi) ugyanazokat a Fortran könyvtárakat használja saját / egyes értékbontások. Ezek a LAPACK és az ARPACK. Az ARPACK az ARnoldi PACKage rövidítését jelenti, és az Arnoldi / Lanczos iterációkról szól. Például. a Matlab-ban két funkció létezik az SVD számára: az svd teljes lebontást hajt végre a LAPACK-on keresztül, az svds pedig az ARPACK-on keresztül kiszámít egy adott számú egyes vektorot, és valójában csak egy eigs hívás a "négyzet alakú" mátrixon.

Frissítés

Kiderült, hogy a Lanczos algoritmusnak vannak olyan változatai, amelyek kifejezetten a $ \ mathbf B $ téglalap alakú mátrix SVD-jének végrehajtására szabva, anélkül, hogy először egy $ \ mathbf A $ négyzetmátrixot készítettünk volna. A központi kifejezés itt a Lanczos bidiagonalization ; amennyire megértem, lényegében trükk, hogy a $ \ mathbf A $ Lanczos-iterációinak minden lépését közvetlenül a $ \ mathbf B $ -on hajtjuk végre anélkül, hogy valaha is elkészítenénk a $ \ mathbf A $ -ot, és ezzel helyet és időt spórolnánk.

Van egy Fortran könyvtár ezekre a módszerekre is, az úgynevezett PROPACK:

A PROPACK szoftvercsomag funkciókat tartalmaz az egyes értékek felbontásának kiszámításához. nagy és ritka vagy strukturált mátrixok. Az SVD rutinok a Lanczos bidiagonalization algoritmuson alapulnak, részleges reortogonalizációval (BPRO).

Úgy tűnik azonban, hogy a PROPACK sokkal kevésbé szabványos, mint az ARPACK, és a normál programozási nyelvek nem támogatják natív módon. Rasmus Larsen írta, akinek nagy, 90 oldalas, 1998-as Lanczos bidiagonalization részleges reortogonalizációval című tanulmánya látszik jó áttekintéssel. Köszönet @MichaelGrant-nek ezen a Computational Science SE szálon keresztül.

A legújabb cikkek közül a legnépszerűbbnek tűnik Baglama & Reichel, 2005, Augmented implicit módon újraindította Lanczos-t. bidiagonalizációs módszerek, amelyek valószínűleg a legkorszerűbbek. Köszönet @Dougal-nak, hogy megadta ezt a linket a megjegyzésekben.

2. frissítés

Valójában egy teljesen más megközelítés létezik, amelyet az áttekintő cikk részletesen leír. magadra hivatkoztál: Halko et al. 2009, Struktúra keresése véletlenszerűséggel: Valószínűségi algoritmusok hozzávetőleges mátrixbontások felépítéséhez. Nem tudok róla annyit, hogy kommentelhessek.

Vegye figyelembe, hogy léteznek SVD-specifikus iterációs módszerek;például.[Augmented Implicitly Restarted Lanczos Bidiagonalization Methods] (http://www.math.kent.edu/~reichel/publications/auglbd.pdf), J. Baglama és L. Reichel, SIAM J. Sci.Számítsd ki.2005. (Nem olvastam a cikket, hogy megtudjam, alapvetően különbözik-e az önérték-megközelítéstől, csak tudd, hogy az emberek szeretik ezt a módszert.)
Köszönöm a linket, @Dougal.Azt kell mondanom, hogy nem igazán ismerem ezeket a módszereket, ezért nem igazán tudok hozzászólni.Nagyon jó lenne, ha valaki hozzáértőbb elmagyarázná a különböző iteratív módszerek kapcsolatát.Ha jól tudom, a vanília Lanczos-módszer egy négyzetmátrix sajátértékeinek kiszámítására szolgál, és nem SVD-re;A "kiterjesztett implicit újraindított Lanczos" -nak szorosan kapcsolódnia kell hozzá, de igazad van - úgy tűnik, hogy közvetlenül az SVD-ről szól.Nem biztos benne, hogy mindez hogyan áll össze.Frissítem a válaszomat, ha valaha is jobban megnézem.
@Dougal, Felületesen olvastam és frissítettem.
@amoeba "csonkolja az SVD-t" a [legalizált legkisebb négyzetek] összefüggésében (http://math.stackexchange.com/questions/1084677/tikhonov- regularization-vs-truncated-svd) lényegében megegyezik az ["alapkomponens regresszióval""] (https://en.wikipedia.org/wiki/Principal_component_regression)?
@GeoMatt22 Igen, ez ugyanaz.
Működik ebből bármelyik, ha a mátrixban lévő értékek nagy része hiányzik?
@StumpyJoePete Nem, nem hiszem.(De ez a kérdés nem a hiányzó értékekre vonatkozott.)
Elfogadható.Tapasztalatom az volt, hogy az embereket gyakran érdekli a csonka SVD az együttműködésen alapuló szűrésben elért sikere miatt (ahol a hiányzó értékek előrejelzése a lényeg).Nyilván nem az egyetlen felhasználás :)
@amoeba Tudna megjegyzést fűzni a Facebook [randomizált SVD megvalósításához] (https://research.fb.com/fast-randomized-svd/), egyesek [úgy tűnik, hogy mondják] (https://www.reddit.com/r/MachineLearning / comments / 3r71ft / fast_randomized_svd_facebook_blog_code /) szerint jelenleg a lehető leggyorsabb megoldások közé tartozik.Nagyon jó lenne, ha szerkesztené ezt a megjegyzést is.
@Tim Nem igazán vagyok gyakorlati tapasztalattal ezen randomizált algoritmusok egyikével sem, ezért nem igazán tudok megjegyzést tenni, sajnálom.Most újraolvasva ezt a választ, úgy érzem, hogy teljesen újra kellene írni, de nem igazán ismerem az irodalmat ahhoz.Lehet, hogy valamikor utána akarok nézni.
@amoeba köszi, reméltem, hogy többet tudhatsz meg róluk, mint én, de úgy tűnik, csak alaposan át kellene néznem a dolgozatokat, és kutatnom kell ...
A randomizált megközelítések valóban nagyon versenyképesek a determinisztikusakkal a sebesség és a pontosság szempontjából.Számos példa és referenciaérték létezik nálunk, főleg a scikit-learn alkalmazásban való felhasználás.Van egy újabb cikk, amely blokk Krylov algoritmust tartalmaz, nagyobb akusztikával és minimális számítási költséggel.Jelenleg nincs meg a linked.
Mondana még egy kicsit arról, hogy a szimmetrikus (+) × (+) mátrix eigendösszetétele hogyan eredményezi az SVD-t?Kicsit gondolkodtam rajta, és nem is nagyon látom.
oli
2018-11-19 15:58:05 UTC
view on stackexchange narkive permalink

Most találtam rá a szálra a gyors SVD-k segítségével, ezért megpróbálom magam kitalálni, de talán érdemes megvizsgálni az adaptive cross approximation (ACA) elemet.

Nem igazán tudom, hogy milyen a probléma, vagy mire van szükséged, de ha a mátrixod $ M $ sima függvényekből van kiszámítva, és csak egy hozzávetőleges elkülönített reprezentáció $ M = \ sum_ {i = 0} ^ k U_i \ cdot V ^ T_i $ , és valójában nem egy "megfelelő" SVD, az ACA algoritmus rendelkezik (majdnem ) lineáris számítási komplexitás ( $ N \ szor N $ mátrix, akkor majdnem $ O (N) $ ). Tehát nagyon gyors; sajnos sokan könnyedén használják a "gyors" szót.

Ismét a problémájától függ, hogy ez működik-e. Sok esetben személyesen találkozom, az ACA nagyon hasznos numerikus eszköz.

Note: ezt meg akartam írni kommentként, de mivel most hoztam létre ezt a fiókot, nincs elég hírem a megjegyzésekhez ... De a közzététel működik.

Stumpy Joe Pete
2015-07-03 04:57:14 UTC
view on stackexchange narkive permalink

Itt van egy technika, amelyet korábban sikeresen alkalmaztam egy csonka SVD kiszámításához (a Netflix adatkészleten). ebből a cikkből származik. Együttműködő szűrési beállításnál meg kell jegyeznem, hogy az értékek nagy része hiányzik, és a lényeg az, hogy előre jelezzük őket , ezért ha csonka SVD-t használ egy ilyen probléma megoldására, akkor olyan technikát kell használnia, amely ilyen körülmények között működik. Rövid leírás:

  1. Mielőtt bármit megtenne, illesszen be egy egyszerű modellt (pl. Globális átlag + oszlop és sor konstans értékek), és csak ezt követően tegye át a csonka használatát SVD, hogy illeszkedjen a maradványokhoz.
  2. Inicializáljon egy k hosszúságú véletlenszerű vektort (ahol ez a rang, amire csonkol) minden sorba és oszlopba (a Netflix esetében minden filmhez és felhasználóhoz).
  3. Tartsa rögzítve a sorvektort, és frissítse az oszlopvektort, hogy minimalizálja a hibát az ismert bejegyzések a mátrixban. Az eljárás matlab kódban van megadva a cikkben.
  4. Tartsa rögzítve az oszlopvektort, és frissítse a sorvektorokat analóg módon.
  5. Ismételje meg a 3 & 4-et, amíg össze nem ér, vagy nem kap elég jó eredmények.


Ezt a kérdést és választ automatikusan lefordították angol nyelvről.Az eredeti tartalom elérhető a stackexchange oldalon, amelyet köszönünk az cc by-sa 3.0 licencért, amely alatt terjesztik.
Loading...