Metoda Nystroem dla aproksymacji jądra

12

Czytałem o metodzie Nyström do aproksymacji jądra niskiej rangi. Ta metoda jest zaimplementowana w scikit-learn [1] jako metoda rzutowania próbek danych na przybliżenie niskiego rzędu mapowania cech jądra.

Zgodnie z moją najlepszą wiedzą, biorąc pod uwagę zestaw szkoleniowy i funkcję jądra, generuje przybliżenie niskiego rzędu macierzy jądra poprzez zastosowanie SVD do a .{xi}i=1nn×nKWC

K=[WK21TK21K22] C=[WK21] ,WRl×l

Nie rozumiem jednak, w jaki sposób można zastosować przybliżenie niskiego rzędu macierzy jądra do projekcji nowych próbek w przybliżonej przestrzeni cech jądra . Artykuły, które znalazłem (np. [2]), nie są zbyt pomocne, ponieważ są mało dydaktyczne.

Ciekawi mnie też złożoność obliczeniowa tej metody, zarówno w fazie szkoleniowej, jak i testowej.

[1] http://scikit-learn.org/stable/modules/kernel_approximation.html#nystroem-kernel-approx

[2] http://www.jmlr.org/papers/volume13/kumar12a/kumar12a.pdf

Daniel López
źródło

Odpowiedzi:

15

Przyjmijmy przybliżenie Nyström w taki sposób, aby wyjaśnić odpowiedzi na pytania.

Kluczowym założeniem w Nyström jest to, że funkcja jądra ma rangę . (Naprawdę zakładamy, że ma w przybliżeniu rangę , ale dla uproszczenia udajmy, że na razie ma dokładnie rangę .) Oznacza to, że każda macierz jądra będzie miała najwyżej , a w szczególności jest rangammmm

K=[k(x1,x1)k(x1,xn)k(xn,x1)k(xn,xn)],
m . Dlatego sąm niezerowe wartości własne i możemy napisać składową eigend K tak jak
K=UΛUT
z wektorami własnymi przechowywanymi w U, o kształcie n×moraz wartości własne ułożone w Λ, an m×m macierz diagonalna.

Wybierzmy m elementy, zwykle jednolicie losowe, ale możliwe, że według innych schematów - w tej uproszczonej wersji liczy się tylko to K11mieć pełną rangę. Kiedy to zrobimy, po prostu ponownie oznakuj punkty, aby otrzymać blok jądra w blokach:

K=[K11K21TK21K22],
gdzie oceniamy każdy wpis w K11 (który jest m×m) i K21 ((nm)×m), ale nie chcę oceniać żadnych wpisów w K22.

Teraz możemy podzielić skład eigend według tej struktury bloku:

K=UΛUT=[U1U2]Λ[U1U2]T=[U1ΛU1TU1ΛU2TU2ΛU1TU2ΛU2T],
gdzie U1 jest m×m i U2 jest (nm)×m. Ale zauważ, że teraz mamyK11=U1ΛU1T. Więc możemy znaleźćU1 i Λ poprzez składanie znanej matrycy K11.

My też to wiemy K21=U2ΛU1T. Tutaj wiemy wszystko w tym równaniu opróczU2, abyśmy mogli rozwiązać, co implikuje wartość własna: pomnóż przez prawo obie strony (ΛU1T)1=U1Λ1 dostać

U2=K21U1Λ1.
Teraz mamy wszystko, co musimy ocenić K22:
K22=U2ΛU2T=(K21U1Λ1)Λ(K21U1Λ1)T=K21U1(Λ1Λ)Λ1U1TK21T=K21U1Λ1U1TK21T(*)=K21K111K21T(**)=(K21K1112)(K21K1112)T.

W (*) znaleźliśmy wersję osadzania Nyström, którą mogłeś zobaczyć jako definicję. To mówi nam o efektywnych wartościach jądra, które przypisujemy blokowiK22.

W (**) widzimy, że macierz funkcji K21K1112, który jest kształtem (nm)×m, odpowiada tym przypisanym wartościom jądra. Jeśli użyjemyK1112 dla m punktów, mamy zestaw mcechy wymiarowe

Φ=[K1112K21K1112].
Możemy to szybko zweryfikować Φ odpowiada poprawnej macierzy jądra:
ΦΦT=[K1112K21K1112][K1112K21K1112]T=[K1112K1112K1112K1112K21TK21K1112K1112K21K1112K1112K21T]=[K11K21TK21K21K111K21T]=K.

Więc wszystko, co musimy zrobić, to trenować nasz regularny model uczenia się z mcechy wymiarowe Φ. Będzie to dokładnie to samo (przy założonych przez nas założeniach), jak wersja jądra problemu uczenia sięK.

Teraz dla pojedynczego punktu danych x, funkcje w Φ odpowiada

ϕ(x)=[k(x,x1)k(x,xm)]K1112.
Za punkt x w partycji 2 wektor [k(x,x1)k(x,xm)] to tylko odpowiedni wiersz K21, dzięki czemu zestawienie ich daje nam K21K1112 - więc ϕ(x) zgadza się na punkty w partycji 2. Działa również w partycji 1: tam wektor jest rzędem K11, więc układanie ich w stos robi się K11K1112=K1112, ponownie zgadzając się z Φ. Więc ... to nadal dotyczy punktu testowego, którego nie widać na szkoleniuxnew. Po prostu robisz to samo:
Φtest=Ktest,1K1112.
Ponieważ założyliśmy, że jądro ma rangę m, macierz [KtrainKtrain,testKtest,trainKtest] ma również rangę moraz rekonstrukcję Ktest jest wciąż dokładnie taka sama logika jak dla K22.


Powyżej przyjęliśmy, że macierz jądra Kbył dokładnie w randzem. Zazwyczaj tak się nie dzieje; na przykład dla jądra Gaussa,Kma zawsze rangęn, ale te ostatnie wartości własne zwykle spadają dość szybko, więc będzie zbliżona do macierzy rangimoraz nasze rekonstrukcje K21 lub Ktest,1będą zbliżone do prawdziwych wartości, ale nie dokładnie takie same. Będą lepsze rekonstrukcje, im bliżej własnej przestrzeniK11 dojdzie do tego K ogólnie rzecz biorąc, dlatego wybór właściwego m punkty są ważne w praktyce.

Zauważ też, że jeśli K11ma dowolne zerowe wartości własne, możesz zamienić odwrotne na pseudoinwersyjne i wszystko nadal działa; po prostu wymieniaszK21 w rekonstrukcji z K21K11K11.

Możesz użyć SVD zamiast eigendecomposition, jeśli chcesz; odKjest psd, są tym samym, ale SVD może być nieco bardziej odporny na niewielki błąd numeryczny w macierzy jądra i tym podobne, więc to właśnie robi scikit-learn. Rzeczywista implementacja scikit-learn to robi, chociaż wykorzystujemax(λi,1012) w odwrotnym zamiast pseudoinwersyjnym.

Dougal
źródło
1
Kiedy A jest dodatnim półfinałem, eigendecomposition UΛUTpokrywa się z SVD. scikit-learn, ponieważ z powodu błędu numerycznegoA może być nieco inny niż psd, zamiast tego oblicza UΣVTi używa A12=VΣ12VT, tak że Astają się funkcje AVΣ12VT=UΣVTVΣ12VT=UΣ12VT=A12. Zasadniczo to samo.
Dougal
1
Ups, przepraszam, tak, używają UΣ12VT=K12. Od tego czasu to wszystko nie ma znaczeniaUV, ale ponieważ dokonują transpozycji funkcji dla K11 skończy jako UΣVTVΣ12UT=UΣ12UT.
Dougal
1
Podniesienie macierzy diagonalnej do potęgi jest tym samym, co podniesienie każdego elementu do potęgi, i x12=1/x. W notacji nadawania numpy mnożenie elementarne przez wektor jest takie samo jak mnożenie przez prawo macierzy diagonalnej. Ponadto ten kod wykorzystujeV znaczy to, co dzwoniłem VT.
Dougal
1
Ups, przepraszam, to powinno być tylko do xm(w zmienionym oznaczeniu, aby były to punkty bazowe Nyström). Naprawię.
Dougal
1
x jest punktem danych, jego wymiar nie jest tu określony. x może być w Rd, lub może to być ciąg znaków lub coś takiego; po prostu to powiedzxX, tak że k:X×XR. Następnieϕ:XRm po prostu się kumuluje k(x,xi) dla mróżne dane wejściowe.
Dougal