Vorberechnete Kernel mit LibSVM in Python

7

Ich habe ungefähr 3 Stunden im Netz gesucht, aber ich konnte noch keine Lösung finden. Ich möchte einen vorberechneten Kernel zu libsvm geben und ein Dataset klassifizieren, aber:

  • Wie kann ich einen vorberechneten Kernel generieren? (Was ist beispielsweise der grundlegende vorberechnete Kernel für Iris-Daten ? )

  • In der libsvm-Dokumentation heißt es:

    Für vorberechnete Kernel muss das erste Element jeder Instanz sein die ID. Zum Beispiel

    %Vor%

Was ist eine ID? Darüber gibt es keine weiteren Details. Kann ich IDs der Reihe nach zuweisen?

Jede libsvm-Hilfe und ein Beispiel für vorberechnete Kernel wurden wirklich geschätzt.

    
Lyyli 19.03.2010, 01:32
quelle

4 Antworten

14

Vor allem , ein Hintergrund für Kernel und SVMs ...

Wenn Sie einen Kernel für n vectors (beliebiger Dimension) vorberechnen möchten, müssen Sie die Kernelfunktion zwischen jedem Paar von Beispielen berechnen. Die Kernelfunktion nimmt zwei Vektoren und gibt einen Skalar, so dass Sie sich einen vorberechneten Kernel als eine nxn Matrix von Skalaren vorstellen können. Es wird normalerweise die Kernel-Matrix oder manchmal die Gram-Matrix genannt.

Es gibt viele verschiedene Kernel, der einfachste ist der lineare Kernel (auch bekannt als das Punktprodukt):

sum(x_i * y_i) for i in [1..N] where (x_1,...,x_N) (y_1,..,y_N) are vectors

Zweitens , versuchen Sie Ihr Problem zu beantworten ...

Die Dokumentation über vorberechnete Kernel in libsvm ist eigentlich ziemlich gut ...

%Vor%

Jeder Vektor hier im zweiten Beispiel ist eine Zeile in der Kernel-Matrix. Der Wert bei Index Null ist der ID-Wert und es scheint nur eine sequentielle Anzahl zu sein. Der Wert am Index 1 des ersten Vektors ist der Wert der Kernelfunktion des ersten Vektors aus dem ersten Beispiel mit sich selbst (dh (1x1)+(1x1)+(1x1)+(1x1) = 4 ), der zweite ist der Wert der Kernelfunktion des ersten Vektors mit dem zweiten ( zB (1x3)+(1x3)=6 ). Es folgt für den Rest des Beispiels. Sie können sehen, dass die Kernmatrix symmetrisch ist, wie es sein sollte, weil K (x, y) = K (y, x).

Es ist erwähnenswert, dass der erste Satz von Vektoren in einem Sparse-Format dargestellt wird (d. h. fehlende Werte sind Null), aber die Kernel-Matrix ist nicht und sollte nicht spärlich sein. Ich weiß nicht, warum das so ist, es scheint nur eine libsvm-Sache zu sein.

    
Stompchicken 19.03.2010 10:07
quelle
5

scikit-learn verbirgt die meisten Details von libsvm beim Umgang mit benutzerdefinierten Kernels. Sie können entweder eine beliebige Funktion als Kernel übergeben und die Gram-Matrix für Sie berechnen oder die vorberechnete Gram-Matrix des Kernels übergeben.

Für die erste lautet die Syntax:

%Vor%

wo my_kernel ist Ihre Kernel-Funktion, und dann können Sie clf.fit (X, y) aufrufen und es wird die Kernel-Matrix für Sie berechnen. Im zweiten Fall lautet die Syntax:

%Vor%

Und wenn Sie clf.fit (X, y) aufrufen, muss X die Matrix k (X, X) sein, wobei k Ihr Kernel ist. Siehe auch dieses Beispiel für weitere Details:

Ссылка

    
Fabian Pedregosa 29.12.2016 17:29
quelle
3

Ich glaube, dass die scikit-learn -Bindung von libSVM Ihre Anforderungen erfüllen sollte. Sehen Sie sich die Beispiele und die Dokumentation unter Ссылка

an     
Gael Varoquaux 11.09.2010 14:42
quelle
2

Hier ist eine einfache Kernel-Eingabedatei mit zwei Kategorie 3-Vektoren, die korrekt funktioniert. Ich werde die Teile erklären (obwohl Sie auch StompChicken's Antwort sehen sollten):

1 0:1 1:10 2:12 3:21
2 0:2 1:12 2:19 3:30
1 0:3 1:21 2:30 3:130

Die erste Zahl in jeder Zeile ist die Kategorie, zu der sie gehört. Der nächste Eintrag in jeder Zeile hat die Form 0: n und muß sequentiell sein, d. H 0: 1 beim ersten Eintrag
0: 2 beim zweiten Eintrag
0: 3 am dritten Eintrag

Ein möglicher Grund dafür ist, dass libsvm die Werte alpha_i zurückgibt, die zu Ihren Vektoren in der Ausgabedatei passen, aber für vorberechnete Kernel werden die Vektoren nicht angezeigt (was wirklich riesig sein könnte), stattdessen der Index 0: n Vektor wird gezeigt, um Ihre Ausgabe einfacher zu machen, um mit Ihrer Eingabe übereinzustimmen. Vor allem, da die Ausgabe nicht in der gleichen Reihenfolge ist, in die Sie sie eingefügt haben, wird sie nach Kategorie gruppiert. Es ist daher sehr nützlich für Sie, wenn Sie die Eingabedatei lesen, um die Ausgaben von libsvm mit Ihren eigenen Eingängen zu vergleichen, um diese 0: n Werte zu haben. Hier sehen Sie die Ausgabe

svm_type c_svc
kernel_type vorberechnet
nr_klasse 2
total_sv 3
rho -1.53951
Etikett 1 2
nr_sv 2 1
SV
0.4126650675419768 0: 1
0.03174528241667363 0: 3
-0,4444103499586504 0: 2

Es ist wichtig zu beachten, dass Sie bei vorberechneten Kernen nicht wie bei allen anderen Kernen die Null-Einträge weglassen können. Sie müssen explizit enthalten sein.

    
John Robertson 13.09.2010 20:35
quelle

Tags und Links