Generalmente, una funzione è una funzione kernel valida (nel senso del trucco del kernel) se soddisfa due proprietà chiave:k(x,y)
simmetria: k(x,y)=k(y,x)
semi-definitività positiva.
Riferimento: pagina 4 di http://www.cs.berkeley.edu/~jordan/courses/281B-spring04/lectures/lec3.pdf
Il controllo della simmetria è generalmente semplice mediante ispezione. La verifica analitica della semi-definitività positiva a volte può essere piuttosto pelosa. Posso pensare a due strategie per verificare questo fatto:
- (1) Ispezione per una rappresentazione di "prodotto interno"
Considera . Possiamo trovare alcuni ϕ ( a ) tali che k ( x , y ) = ϕ ( x ) T ϕ ( y ) ? Un po 'di matematica mostra che e x + y = e x e y , quindi sia ϕ ( a ) = e a e il gioco è fatto.k(x,y)=ex+yϕ(a)k(x,y)=ϕ(x)Tϕ(y)ex+y=exeyϕ(a)=ea
Se sei fortunato, il tuo sarà suscettibile di questa analisi. In caso contrario, puoi ricorrere all'opzione (2):k()
- (2) Verifica della definizione positiva mediante simulazione casuale.
Considera la funzione su -dim vettori k ( → x , → y ) = ∑ D d = 1 min ( x d , y d ) , dove ogni vettore → x , → y deve essere non negativo e sommare a uno. È un kernel valido?Dk(x⃗ ,y⃗ )=∑Dd=1min(xd,yd)x⃗ ,y⃗
Possiamo verificarlo mediante simulazione. Disegna un insieme di vettori casuali { → x i } N i = 1 e costruisci una matrice Gram K dove K i j = k ( → x i , → x j ) . Quindi controlla se K è positivo (semi) definito.N{x⃗ i}Ni=1KKij=k(x⃗ i,x⃗ j)K
Il modo migliore per farlo numericamente è trovare gli autovalori della matrice (usando buone librerie numeriche esistenti come scipy o matlab) e verificare che il più piccolo autovalore sia maggiore o uguale a 0 . Se sì, la matrice è psd Altrimenti, non hai un kernel valido.K
Esempio di codice MATLAB / Octave:
D=5;
N=100;
X = zeros(N,D);
for n = 1:N
xcur = rand(1,D);
X(n,:) = xcur/sum(xcur);
end
K = zeros(N,N);
for n = 1:N; for m = 1:N
K(n,m) = sum( min( X(n,:), X(m,:) ) );
end; end;
disp( min( eig(K) ) );
Questo è un test molto semplice, ma fai attenzione . Se il test fallisce, puoi essere sicuro che il kernel non è valido, ma se passa il kernel potrebbe non essere valido.
Trovo che indipendentemente da quante matrici casuali generi e indipendentemente da e D , questo kernel supera il test, quindi è probabilmente semi-definito positivo (in realtà, questo è il noto kernel di intersezione dell'istogramma ed è stato dimostrato valido).ND
Tuttavia, lo stesso test su fallisce ad ogni tentativo che gli ho dato (almeno 20). Quindi è sicuramente non valido e abbastanza facile da verificare.k(x⃗ ,y⃗ )=∑Dd=1max(xd,yd)
Mi piace molto questa seconda opzione perché è abbastanza rapida e molto più facile da eseguire il debug delle prove formali compilate. Secondo la slide 19 di Jitendra Malik , il kernel di intersezione è stato introdotto nel 1991 ma non si è dimostrato corretto fino al 2005. Le prove formali possono essere molto impegnative!