Helfen Sie mit predict() für kernlab der SVM in R?
Ich versuche, mit der kernlab
R-Paket zu tun Support-Vektor-Maschinen (SVM). Für mein sehr einfaches Beispiel, ich habe zwei Stücke von Trainingsdaten. A und B.
(A und B sind vom Typ matrix
- Sie sind angrenzens Matrizen für Graphen.)
Also schrieb ich eine Funktion, die A+B und erzeugt ein kernel-matrix.
> km
[,1] [,2]
[1,] 14.33333 18.47368
[2,] 18.47368 38.96053
Nun benutze ich kernlab
's ksvm
Funktion zum generieren von meinem prädiktives Modell aus. Gerade jetzt, ich versuche nur, um das verflixte Ding zu arbeiten - ich bin nicht besorgt über training, Fehler, etc.
So, Frage 1: Bin ich der Generierung meinem Modell richtig? Vernünftig?
# y are my classes. In this case, A is in class "1" and B is in class "-1"
> y
[1] 1 -1
> model2 = ksvm(km, y, type="C-svc", kernel = "matrix");
> model2
Support Vector Machine object of class "ksvm"
SV type: C-svc (classification)
parameter : cost C = 1
[1] " Kernel matrix used as input."
Number of Support Vectors : 2
Objective Function Value : -0.1224
Training error : 0
So weit So gut. Wir erstellten unsere custom kernel matrix, und dann haben wir ein ksvm Modell, das mit dieser matrix. Wir haben unsere Trainings-Daten mit der Bezeichnung "1" und "-1".
Jetzt voraussagen:
> A
[,1] [,2] [,3]
[1,] 0 1 1
[2,] 1 0 1
[3,] 0 0 0
> predict(model2, A)
Error in as.matrix(Z) : object 'Z' not found
Uh-oh. Das ist in Ordnung. Art erwartet, wirklich. "Vorhersagen" will eine Art von Vektor, keine matrix.
So können versuchen, einige Dinge:
> predict(model2, c(1))
Error in as.matrix(Z) : object 'Z' not found
> predict(model2, c(1,1))
Error in as.matrix(Z) : object 'Z' not found
> predict(model2, c(1,1,1))
Error in as.matrix(Z) : object 'Z' not found
> predict(model2, c(1,1,1,1))
Error in as.matrix(Z) : object 'Z' not found
> predict(model2, km)
Error in as.matrix(Z) : object 'Z' not found
Einige der oben genannten tests sind unsinnig, aber das ist mein Punkt: egal was ich mache, ich bekomme einfach nicht predict() meine Daten und eine Vorhersage. Skalare, die nicht arbeiten, Vektoren, die nicht arbeiten. Eine 2x2-matrix funktioniert nicht, auch nicht eine 3x3-matrix.
Was mache ich hier falsch?
(Sobald ich herausfinden, was ksvm will, dann kann ich sicherstellen, dass mein test-Daten können entsprechen Sie, dass das format in einem vernünftigen/angemessenen/mathematisch sound Weg.)
InformationsquelleAutor poundifdef | 2009-11-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie denken, darüber, wie die support-vector-machine könnte die "Verwendung" der kernel-matrix, wirst du sehen, dass Sie können nicht richtig dies tun Sie in der Weise, die Sie versuchen, (wie Sie gesehen haben 🙂
Ich eigentlich kämpfte ein wenig mit dieser, wenn ich das erste war mit kernlab + einen kernel-matrix ... zufällig, es war auch für graph-Kernel!
Sowieso, lassen Sie uns zunächst klar, dass da der SVM nicht wissen, wie zur Berechnung der kernel-Funktion, die es braucht, um diese Werte schon berechnet, zwischen dem neuen (Test -) Beispiele und die Beispiele, die er wählt, wie die support-Vektoren, die während des Trainings Schritt.
So, müssen Sie benötigen, um die Berechnung der kernel-matrix für alle deine Beispiele zusammen. Sie werden später Zug auf einige und test auf die anderen durch das entfernen von Zeilen + Spalten der kernel-matrix, wenn angemessen. Lassen Sie mich Ihnen zeigen, mit code.
Können wir mit den Beispiel-code in der
ksvm
Dokumentation laden unser Arbeitsbereich mit einigen Daten:Müssen Sie drücken Sie die EINGABETASTE ein paar (2) Zeiten, um zu lassen die Grundstücke zu ziehen, und lassen Sie das Beispiel beenden, aber Sie sollten nun ein kernel-matrix in Ihrem Arbeitsbereich genannt
K
. Wir müssen zum wiederherstellen dery
Vektor, die Sie verwenden sollten für Ihre Etiketten (es wurde mit Füßen getreten durch anderen code in dem Beispiel):Nun, wählen Sie eine Teilmenge der Beispiele zum testen verwenden
Ab diesem Punkt werde ich:
trainK
von der ursprünglichenK
kernel-matrix.trainK
testK
... das ist der komische Teil. Wenn man sich den code inkernlab
zu sehen, wie es verwendet die support vector Indizes, Sie werden sehen, warum es auf diese Weise getan. Es könnte möglich sein, das zu tun diese andere Art, aber ich sehe keine Dokumentation/Beispiele auf Vorhersage mit einer kernel-matrix, also mache ich es "der harte Weg" hier.Hier der code:
Sollte nur um es zu tun. Viel Glück!
Reaktionen auf Kommentar unten
Stellen Sie sich vor Sie haben ein Vektor
x
, und Sie wollen zum abrufen der Elemente 1, 3 und 5 aus, Sie tun würde:Wenn Sie abrufen möchten alles aus
x
außer Elemente 1, 3 und 5, die Sie tun würde:So
K[-holdout,-holdout]
gibt alle Zeilen und Spalten vonK
außer für die Zeilen wollen wir die Zurückhaltung.Yeah, ich inlined zwei Befehle in einem:
Nun, da Sie trainiert haben, das Modell, die Sie wollen, um ihm eine neue kernel-matrix mit Ihrem Beispiele zum testen.
K[holdout,]
geben würde, Sie nur die Zeilen, die denen entsprechen, auf die Ausbildung Beispiele inK
, und alle SpaltenK
.SVindex(m)
gibt Ihnen die Indizes von Ihren support-Vektoren aus Ihrem original Ausbildung matrix-denken Sie daran, die Zeilen/Spalten habenholdout
entfernt. So für die Spalte Indizes korrekt zu sein (dh. Referenz die richtigen sv-Spalte), muss ich zuerst entfernen Sie dieholdout
Spalten.Sowieso, vielleicht ist das verständlicher:
Nun
testK
nur die Zeilen unserer Beispiele zum testen und die Spalten entsprechen der support-Vektoren.testK[1,1]
wird der Wert der kernel-Funktion berechnet, die zwischen Ihrem ersten Test-Beispiel, und die ersten support-Vektor.testK[1,2]
haben die kernel-Funktion Wert zwischen Ihrem 1. testen der Beispiel-und der zweite support-vector, etc.Update (2014-01-30) zu beantworten Kommentar von @wrahool
Es ist schon eine Weile her, seit ich gespielt habe mit diese, so die Angaben der
kernlab::ksvm
sind ein wenig eingerostet, aber im Prinzip sollte richtig sein 🙂 ... hier geht:Ja. Die kurze Antwort ist, dass, wenn Sie wollen
predict
durch ein kernel-matrix, die Sie zu liefern haben, die eine matrix der dimensionrows
durchsupport vectors
. Für jede Zeile der matrix (die neue Beispiel, das Sie wollen, um Vorhersagen über) die Werte in den Spalten sind einfach der Wert der kernel-matrix ausgewertet, die zwischen diesem Beispiel und der support vector.Den Aufruf
SVindex(m)
gibt den index der support-Vektoren in der dimension der original Trainingsdaten.So, den ersten zu tun
testK <- K[holdout, -holdout]
gibt mir eintestK
matrix mit den Zeilen der Beispiele, die ich möchte, um vorherzusagen, auf, und die Spalten sind von der gleichen Beispiele (dimension) wurde das Modell trainiert wird.Ich weitere Teilmenge der Spalten von
testK
durchSVindex(m)
zu gebt mir nur die Spalten, die (jetzt) entsprechen meiner support-Vektoren. Hatte ich nicht getan, die ersten[, -holdout]
Auswahl, die Indizes wieder vonSVindex(m)
entspricht möglicherweise nicht die richtigen Beispiele (es sei denn, alleN
Ihrer Beispiele zum testen sind die letztenN
Spalten deiner matrix).Es ist ein bisschen defensiv-Codierung, um sicherzustellen, dass nach der Indizierung operation durchgeführt wird, wird das Objekt, das zurückgegeben wird, ist vom gleichen Typ wie das Objekt, das indiziert wurde.
In R, wenn Sie den index nur eine dimension der 2D - (oder besser(?)) Objekt, es wird wieder ein Objekt von der niederen dimension. Ich don ' T wollen, eine
numeric
Vektor inpredict
will, weil es einematrix
Beispielsweise
Das gleiche passiert mit
data.frame
s, etc.Da war es lange reagierte ich auf Ihren Kommentar in meinem ursprünglichen post -- Lesen Sie die untere Hälfte. Wenn Sie weitere Fragen haben, können Sie immer kommen, um die r-Hilfe Liste um weitere Fragen zu stellen. Schließlich, wenn meine Antwort nicht deine Frage zu beantworten, vergessen Sie nicht zu markieren es als solches 😉
Dude. Sie rocken so sehr. Danke!!!
Versteh mich nicht falsch, aber wenn Sie nur über begrenzte Kenntnisse der SVMs, sollten Sie Ihre Hausaufgaben machen, um besser zu verstehen, wie Sie funktionieren, bevor Sie nur "blind" mit Ihnen. , Dass gesagt worden ist: (1) Die kernel-Funktion ist eine funct ' N von Funktionen in Ihrem Beispiele, und ist unabhängig von den Etiketten, so dass Sie nicht brauchen
y
bei der Berechnung der kernel-matrix; und (2) es ist möglich, aber Sie würden wahrscheinlich haben, um code die Lösung selbst. Die kernel-matrix liefert Sie die kernel-Werte für jedes paar Beispiele (row,col). Sie müssen, um eine "aktualisierte" kernel-matrix, die respektiert, dass.Ich bin eine Aktualisierung meiner Antwort auf Ihren Kommentar-es ist zu lang und passt nicht in dieses Kommentarfeld.
InformationsquelleAutor Steve Lianoglou
First off, ich habe nicht verwendet kernlab viel. Aber einfach auf der Suche in den docs, ich sehe, funktionierende Beispiele für die
predict.ksvm()
Methode. Kopieren, einfügen und weglassen der Drucke auf Bildschirm:Scheint ziemlich straight-laced: verwenden Sie Stichproben zu generieren, die eine Ausbildung
genetrain
und sein Komplementgenetest
dann passend überksvm
und einen Anruf an einenpredict()
Methode mit der Passform, und die neuen Daten in einem passenden format. Dies ist sehr standard.Finden Sie die caret Paket von Max Kuhn nützlich. Es bietet eine Allgemeine Evaluierung und Test-Frameworks für eine Vielzahl von regression, Klassifikation und machine learning-Methoden und-Pakete, einschließlich kernlab, und enthält mehrere Vignetten plus ein JSS Papier.
Wenn Sie neugierig sind, bin ich versucht zu implementieren graph-Kernel in R - also eher als klassifizieren von Vektordaten, ich bin auf der Suche auf der graph-Daten. So, meine kernel-Funktion sieht an der Anzahl der random walks, die äquivalent zwischen zwei Graphen zu bestimmen, deren "Abstand"
InformationsquelleAutor Dirk Eddelbuettel
Steve Lianoglou richtig ist.
In kernlab es ist ein bisschen wired und wenn die Vorhersage Bedarf es der Eingabe der kernel-matrix zwischen den einzelnen test-Beispiel-und die support-Vektoren. Sie müssen finden diese matrix selbst.
Beispielsweise eine test-matrix [n x m], wobei n die Anzahl der Proben und m ist die Anzahl der support-Vektoren in der Gelehrten-Modell (geordnet in der Reihenfolge der SVindex(Modell -)).
Beispiel-code
Kernel ist der Eingang der kernel-matrix. trainidx und testidx sind ids für training und test.
InformationsquelleAutor user1165814
Erstellen die Beschriftungen selbst von den Elementen der Lösung. Verwenden Sie diese Alternative Prädiktor-Methode nimmt ksvm Modell (m) und die Daten in der ursprünglichen Ausbildung-format (d)
K ist ein
kernelMatrix
für die Ausbildung. Für die Validierung Willen, wenn Siepredict.alt
auf die Trainingsdaten werden Sie feststellen, dass die Alternative Prädiktor-Methode schaltet die Werte neben den gefitteten Werte, die von ksvm. Die native Prädiktor verhält sich in einer unerwarteten Weise:InformationsquelleAutor user3349904