Méthode Nystroem pour l'approximation du noyau

12

J'ai lu sur la méthode Nyström pour aproximation du noyau de bas rang. Cette méthode est implémentée dans scikit-learn [1] comme méthode pour projeter des échantillons de données à une approximation de bas rang du mappage des fonctionnalités du noyau.

À ma connaissance, étant donné un ensemble d'apprentissage et une fonction de noyau, il génère une approximation de bas rang de la matrice de noyau en appliquant SVD à et .{xi}i=1nn×nKWC

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

Cependant, je ne comprends pas comment l'approximation de bas rang de la matrice du noyau peut être utilisée pour projeter de nouveaux échantillons dans l'espace des fonctionnalités du noyau approché . Les articles que j'ai trouvés (par exemple [2]) ne sont pas d'une grande utilité, car ils sont peu didactiques.

De plus, je suis curieux de connaître la complexité de calcul de cette méthode, à la fois dans les phases de formation et de test.

[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
la source

Réponses:

15

Dérivons l'approximation de Nyström d'une manière qui devrait rendre les réponses à vos questions plus claires.

L'hypothèse clé dans Nyström est que la fonction du noyau est de rang . (Vraiment, nous supposons qu'il est approximativement de rang , mais pour simplifier, supposons que c'est exactement le rang pour l'instant.) Cela signifie que toute matrice de noyau va avoir un rang au plus , et en particulier est le rang . Il y a donc valeurs propres non nulles, et nous pouvons écrire la composition propre de comme m m m K = [ k ( x 1mmmmmmKK=UΛUTUn×mΛm

K=[k(x1,x1)k(x1,xn)k(xn,x1)k(xn,xn)],
mmK
K=UΛUT
avec des vecteurs propres stockés dans , de forme , et des valeurs propres disposées dans , une matrice diagonale .Un×mΛm×m

Alors, choisissons éléments, généralement uniformément au hasard mais éventuellement selon d'autres schémas - tout ce qui compte dans cette version simplifiée est que soit de rang complet. Une fois que nous le faisons, il suffit de réétiqueter les points afin de nous retrouver avec la matrice du noyau en blocs: où nous évaluons chaque entrée dans (qui est ) et ( ), mais nous ne voulons pas évaluer les entrées dans .K 11 K = [ K 11 K T 21 K 21 K 22 ] , K 11 m × m K 21 ( n - m ) × m K 22mK11

K=[K11K21TK21K22],
K11m×mK21(nm)×mK22

Maintenant, nous pouvons également diviser la composition d'origine en fonction de cette structure de bloc: où est et est . Mais notez que nous avons maintenant . On peut donc trouver et en composant par eigendecomposant la matrice connue .

K=UΛUT=[U1U2]Λ[U1U2]T=[U1ΛU1TU1ΛU2TU2ΛU1TU2ΛU2T],
U1m×mU2(nm)×mK11=U1ΛU1TU1ΛK11

Nous savons aussi que . Ici, nous savons tout dans cette équation sauf , donc nous pouvons résoudre pour quelles valeurs propres cela implique: multiplier à droite des deux côtés par pour obtenir Nous avons maintenant tout ce dont nous avons besoin pour évaluer : K21=U2ΛU1TU2(ΛU1T)1=U1Λ1

U2=K21U1Λ1.
K22
K22=U2ΛU2T=(K21U1Λ1)Λ(K21U1Λ1)T=K21U1(Λ1Λ)Λ1U1TK21T=K21U1Λ1U1TK21T(*)=K21K111K21T(**)=(K21K1112)(K21K1112)T.

Dans (*), nous avons trouvé une version de l'incorporation de Nyström que vous auriez pu voir simplement comme la définition. Cela nous indique les valeurs effectives du noyau que nous imputons pour le bloc .K22

Dans (**), nous voyons que la matrice d' , qui est la forme , correspond à ces valeurs de noyau imputées. Si nous utilisons pour les points, nous avons un ensemble de caractéristiques à dimensions Nous pouvons simplement vérifier rapidement que correspond à la matrice de noyau correcte: K21K1112(nm)×mK1112mm

Φ=[K1112K21K1112].
Φ
ΦΦT=[K1112K21K1112][K1112K21K1112]T=[K1112K1112K1112K1112K21TK21K1112K1112K21K1112K1112K21T]=[K11K21TK21K21K111K21T]=K.

Donc, tout ce que nous devons faire est de former notre modèle d'apprentissage régulier avec les fonctionnalités dimensionnelles . Ce sera exactement le même (sous les hypothèses que nous avons fait) que la version kernelized du problème d'apprentissage avec .mΦK

Maintenant, pour un point de données individuel , les fonctionnalités de correspondent à Pour un point dans la partition 2, le vecteur n'est que la ligne appropriée de , de sorte que l'empilement cela nous donne - donc est d'accord pour les points de la partition 2. Cela fonctionne aussi dans la partition 1: là, le vecteur est une rangée de , donc les empiler devient , encore une fois d'accord avecxΦ

ϕ(x)=[k(x,x1)k(x,xm)]K1112.
x[k(x,x1)k(x,xm)]K21K21K1112ϕ(x)K11K11K1112=K1112Φ. Donc ... c'est toujours vrai pour un point de test invisible au moment de la formation . Vous faites juste la même chose: Parce que nous avons supposé que le noyau était de rang , la matrice est également de rang , et la reconstruction de est toujours exacte avec exactement la même logique que pour .xnew
Φtest=Ktest,1K1112.
m[KtrainKtrain,testKtest,trainKtest]mKtestK22


Ci-dessus, nous avons supposé que la matrice du noyau était exactement de rang . Ce ne sera généralement pas le cas; pour un noyau gaussien, par exemple, est toujours de rang , mais ces dernières valeurs propres chutent assez rapidement, donc ça va être proche d' une matrice de rang , et nos reconstructions de ou vont être proches des vraies valeurs mais pas exactement les mêmes. Ce seront de meilleures reconstructions à mesure que l'espace propre de se rapprochera de celui deKmKnmK21Ktest,1K11Kdans l'ensemble, c'est pourquoi le choix des bons points est important dans la pratique.m

Notez également que si a des valeurs propres nulles, vous pouvez remplacer les inverses par des pseudoinverses et tout fonctionne toujours; vous venez de remplacer dans la reconstruction par .K11K21K21K11K11

Vous pouvez utiliser le SVD au lieu de la composition eigend si vous le souhaitez; puisque est psd, c'est la même chose, mais le SVD pourrait être un peu plus robuste à une légère erreur numérique dans la matrice du noyau et ainsi, c'est ce que fait scikit-learn. L' implémentation réelle de scikit-learn fait cela, bien qu'elle utilise à l'inverse de la pseudoinverse.max ( λ i , 10 - 12 )Kmax(λi,1012)

Dougal
la source
1
Lorsque est semi-défini positif, la composition de l’égalité coïncide avec la SVD. scikit-learn, car en raison d'une erreur numérique, peut être légèrement non psd, calcule à la place et utilise , donc que caractéristiques de devenir . C'est la même chose, en gros. AUΛUTAUΣVTA12=VΣ12VTAAVΣ12VT=UΣVTVΣ12VT=UΣ12VT=A12
Dougal
1
Oups, désolé, oui, ils utilisent . Tout n'a pas vraiment depuis , mais comme ils font la transposent les caractéristiques pour fin comme . UΣ12VT=K12UVK11UΣVTVΣ12UT=UΣ12UT
Dougal
1
Élever une matrice diagonale à une puissance équivaut à élever chaque élément à une puissance, et . Dans la notation de diffusion numpy, la multiplication par élément par un vecteur est identique à la multiplication à droite par une matrice diagonale. En outre, que les utilisations de code pour signifier ce que j'appelle . VVTx12=1/xVVT
Dougal
1
Oups, désolé, cela ne devrait être que jusqu'à (dans l'ordre de réétiquetage, de sorte que ce soient les points de base de Nyström). Réparera. xm
Dougal
1
x R d x X k : X × XR ϕ : XR m k ( x , x i ) mx est un point de données, sa dimension n'est pas spécifiée ici. pourrait être dans , ou ce pourrait être une chaîne ou quelque chose; juste dire que , de sorte que . Alors empile juste pour entrées différentes. xRdxXk:X×XRϕ:XRmk(x,xi)m
Dougal