Frage

Ich versuche, verwenden Sie die 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 Graphen.)

Also schrieb ich eine Funktion, die A+B und erzeugt eine kernel-matrix.

> km
         [,1]     [,2]
[1,] 14.33333 18.47368
[2,] 18.47368 38.96053

Jetzt benutze ich kernlab's ksvm Funktion für die Erstellung meiner predictive model.Jetzt bin ich nur versuchen, um das verdammte Ding zu arbeiten, ich bin nicht besorgt über die Ausbildung der Fehler, etc.

So, Frage 1:Bin ich Generierung mein Modell korrekt?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 erstellt unsere eigene kernel-matrix, und dann haben wir eine ksvm Modell 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 okay.Art von erwartet, wirklich."Vorhersagen" will eine Art von Vektor -, nicht eine matrix.

So können versuchen, ein paar 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 Vorhersagen, () meine Daten, und machen eine Vorhersage.Skalare nicht funktionieren, Vektoren nicht funktionieren.Eine 2x2-matrix funktioniert nicht, noch eine 3x3-matrix.

Was mache ich hier falsch?

(Sobald ich herausfinden, was ksvm will, dann kann ich sicherstellen, dass mein test Daten können Ports diesem format entsprechen, in ein vernünftiger/vernünftige/mathematisch-sound Weg.)

War es hilfreich?

Lösung

Wenn Sie darüber nachdenken, wie die support-vector-Maschine könnte die "Verwendung" der kernel-matrix, Sie werden sehen, dass Sie können nicht wirklich tun, wie Sie versuchen (wie Sie gesehen haben :-)

Ich habe tatsächlich kämpfte ein wenig mit dieser, wenn ich das erste war mit kernlab + a kernel matrix ...zufällig, es war auch für graph-Kernel!

Sowieso, lassen Sie uns zunächst klar, dass da die SVM nicht wissen, wie Sie berechnen Sie Ihre kernel-Funktion, die es braucht, um diese Werte schon berechnet, die zwischen dem neuen (Test -) Beispiele und die Beispiele, die er wählt, wie die support-Vektoren während der Ausbildung Schritt.

So, Sie brauchen zu berechnen die kernel-matrix für alle Ihre Beispiele zusammen.Sie werden später in der Bahn auf einigen und testen auf der anderen durch entfernen von Zeilen + Spalten aus der kernel-matrix, wenn angemessen.Lassen Sie mich Ihnen zeigen, mit code.

Wir können verwenden Sie den Beispiel-code in die ksvm Dokumentation zu laden unser Arbeitsbereich mit einigen Daten:

library(kernlab)
example(ksvm)

Sie müssen drücken Sie die EINGABETASTE ein paar (2) mal, um zu lassen die Diagramme zu zeichnen, und lassen Sie das Beispiel beenden, aber Sie sollten jetzt einen kernel-matrix in Ihrem Arbeitsbereich genannt K.Wir müssen zum wiederherstellen der y Vektor, sollten Sie für Ihre Etiketten (wie es wurde mit Füßen getreten, indem code in dem Beispiel):

y <- matrix(c(rep(1,60),rep(-1,60)))

Jetzt wählen Sie eine Teilmenge von Beispielen für die Prüfung zu verwenden

holdout <- sample(1:ncol(K), 10)

Von diesem Punkt an werde ich:

  1. Erstellen Sie eine Ausbildung kernel-matrix benannt trainK von der ursprünglichen K kernel matrix.
  2. Erstellen Sie ein SVM-Modell aus meinem Trainings-set trainK
  3. Verwenden Sie die support-Vektoren gefunden, die aus der Modell-Erstellung eines Test-kernel-matrix testK ...dies ist der seltsame Teil.Wenn Sie sich die code in kernlab um zu sehen, wie es verwendet die support-vector-Indizes, du wirst sehen, warum es auf diese Weise getan.Es könnte möglich sein, dies zu tun, einen anderen Weg, aber ich sehe keine Dokumentation/Beispiele Vorhersage mit einer kernel-matrix, also mache ich es "der harte Weg" hier.
  4. Verwenden Sie die SVM, um vorherzusagen, auf diese Merkmale und Genauigkeit der Berichte

Hier ist der code:

trainK <- as.kernelMatrix(K[-holdout,-holdout])  # 1
m <- ksvm(trainK, y[-holdout], kernel='matrix')  # 2
testK <- as.kernelMatrix(K[holdout, -holdout][,SVindex(m), drop=F]) # 3
preds <- predict(m, testK)  # 4
sum(sign(preds) == sign(y[holdout])) / length(holdout) # == 1 (perfect!)

Das sollte nur über es tun.Viel Glück!

Antworten zum Kommentar unten

was bedeutet K[-Zurückhaltung-die Zurückhaltung] bedeuten?(was bedeutet das "-" bedeuten?)

Stellen Sie sich vor Sie haben einen Vektor x, und Sie wollen zum abrufen der Elemente 1, 3 und 5 aus, Sie würden tun:

x.sub <- x[c(1,3,5)]

Wenn Sie abrufen möchten alles aus x außer Elemente 1, 3 und 5, würden Sie tun:

x.sub <- x[-c(1,3,5)]

So K[-holdout,-holdout] gibt alle Zeilen und Spalten von K außer für die Zeilen, möchten wir Zurückhaltung.

Was sind die Argumente, die von Ihr als.kernelMatrix - vor allem die [,SVindex(m),drop=F] - argument (das ist besonders seltsam, weil es sieht aus wie die ganze Halterung ist eine matrix mit index K?)

Ja, ich inlined zwei Befehle in einem:

testK <- as.kernelMatrix(K[holdout, -holdout][,SVindex(m), drop=F])

Jetzt, dass Sie trainiert haben die Modell Sie wollen zu geben Sie eine neue kernel-matrix mit Ihren Test-Beispiele. K[holdout,] Ihnen würde nur die Zeilen entsprechen den Trainings-Beispiele in K, und alle Spalten K.

SVindex(m) gibt Sie die Indizes Ihres support-Vektoren von Ihrem original Ausbildung matrix-denken Sie daran, die Zeilen/Spalten haben holdout entfernt.So für die Spalte Indizes korrekt zu sein (dh.verweisen Sie die richtige sv-Spalte), müssen Sie zuerst entfernen Sie die holdout Spalten.

Trotzdem ist dies vielleicht klarer:

testK <- K[holdout, -holdout]
testK <- testK[,SVindex(m), drop=FALSE]

Jetzt testK nur hat die Reihen unserer Beispiele zum testen und die Spalten entsprechen den support-Vektoren. testK[1,1] wird der Wert der kernel-Funktion berechnet, die zwischen Ihrem ersten Prüfung Beispiel, und die ersten support-Vektor. testK[1,2] wird die kernel-Funktion Wert zwischen Ihre 1. Prüfung 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 dieser, so die Angaben der kernlab::ksvm ein wenig eingerostet, aber im Prinzip sollte dies korrekt sein :-) ...hier geht:

was ist der Punkt von testK <- K[holdout, -holdout] - nicht entfernen Sie die Spalten entsprechen den test-set?

Ja.Die kurze Antwort ist, dass, wenn Sie wollen predict mit einer kernel-matrix, Sie zu liefern haben, die eine matrix der dimension rows von support vectors.Für jede Zeile der matrix (das neue Beispiel, das Sie Vorhersagen möchten, auf) die Werte in den Spalten sind einfach der Wert der kernel-matrix ausgewertet, die zwischen diesem Beispiel und der support vector.

Der Aufruf SVindex(m) gibt den index der Unterstützung der Vektoren, die in die dimension der original Trainings-Daten.

So, den ersten zu tun testK <- K[holdout, -holdout] gibt mir ein testK matrix mit den Zeilen der Beispiele, die ich Vorhersagen möchten, auf, und die Spalten sind von der gleichen Beispiele (dimension) wurde das Modell trainiert wird.

Ich weiter Teilmenge der Spalten von testK von SVindex(m) nur geben mir die Spalten, die (jetzt) entsprechen meiner support-Vektoren.Hatte ich nicht getan, das erste [, -holdout] Auswahl, die Indizes wieder durch SVindex(m) entspricht möglicherweise nicht die richtigen Beispiele (es sei denn, alle N in Ihren Tests Beispiele sind die letzten N Spalten deiner matrix).

Auch, was genau bedeutet das drop = FALSE-Bedingung tun?

Es ist ein bisschen defensiv-Codierung, um sicherzustellen, dass nach der Indizierung operation durchgeführt wird, wird das Objekt zurückgegeben wird, ist vom gleichen Typ wie das Objekt, das indiziert wurde.

In R, wenn Sie den index nur eine dimension eines 2D - (oder höher(?)) Objekt, Sie sind zurückgegeben, die ein Objekt der unteren dimension.Ich nicht wollen, eine numeric - Vektor in predict denn es will matrix

Zum Beispiel

x <- matrix(rnorm(50), nrow=10)

class(x)
[1] "matrix"

dim(x)
[1] 10  5

y <- x[, 1]

class(y)
[1] "numeric"

dim(y)
NULL

Das gleiche passiert mit data.frames, etc.

Andere Tipps

Als erstes habe ich nicht kernlab viel verwendet. Aber einfach bei der Dokumentation suchen, ich sehe Arbeitsbeispiele für die predict.ksvm() Methode. Kopieren und Einfügen, und das Weglassen des Druck Bildschirm:

 ## example using the promotergene data set
 data(promotergene)

 ## create test and training set
 ind <- sample(1:dim(promotergene)[1],20)
 genetrain <- promotergene[-ind, ]
 genetest <- promotergene[ind, ]

 ## train a support vector machine
 gene <-  ksvm(Class~.,data=genetrain,kernel="rbfdot",\
               kpar=list(sigma=0.015),C=70,cross=4,prob.model=TRUE)

 ## predict gene type probabilities on the test set
 genetype <- predict(gene,genetest,type="probabilities")

Das scheint ziemlich prüde: Verwenden Sie stichprobenartig einen Trainingssatz genetrain und sein Komplement genetest zu erzeugen, dann über ksvm und einen Aufruf ein predict() Verfahren Einpassen des Passform verwenden, und neue Daten in einem passenden Format. Dies ist sehr Standard.

Sie können feststellen, die caret Paket von Max Kuhn nützlich. Es bietet eine allgemeine Bewertung und Prüfung Rahmen für eine Vielzahl von Regression, Klassifikation und Maschinen Methoden und Pakete Lernen, einschließlich kernlab und mehrere Vignetten enthält sowie ein JSS Papier .

Steve Lianoglou ist richtig.

In kernlab ist es ein bisschen verdrahtet, und wenn die Vorhersage erfordert die Eingabe-Kernmatrix zwischen jedem Testbeispiel und die Stützvektoren. Sie müssen diese Matrix selbst finden.

Zum Beispiel kann eine Testmatrix [N x m], wobei n die Anzahl der Testproben und m die Anzahl von Stützvektoren in dem gelernten Modell ist (Reihenfolge in der Folge von SVindex (Modell)).

Beispiel-Code

trmat <- as.kernelMatrix(kernels[trainidx,trainidx])
tsmat <- as.kernelMatrix(kernels[testidx,trainidx])

#training
model = ksvm(x=trmat, y=trlabels, type = "C-svc", C = 1)

#testing
thistsmat = as.kernelMatrix(tsmat[,SVindex(model)])
tsprediction = predict(model, thistsmat, type = "decision")

Kernel ist die Eingangskernmatrix. trainidx und testidx sind IDs für Training und Test.

Erstellen Sie die Etiketten selbst aus den Elementen der Lösung. Verwenden Sie diese alternative Methode, den Prädiktor ksvm Modell (m) und Daten im ursprünglichen Trainingsformat (d)

nimmt
predict.alt <- function(m, d){
  sign(d[, m@SVindex] %*% m@coef[[1]] - m@b)
}

K ist ein kernelMatrix für die Ausbildung. Zur Validierung willen, wenn Sie predict.alt auf den Trainingsdaten ausgeführt werden Sie feststellen, dass die alternative Prädiktor Methode schaltet Werte neben den angepassten Werte von ksvm zurückgegeben. Die nativen Prädiktor verhält sich in unerwarteter Weise:

aux <- data.frame(fit=kout@fitted, native=predict(kout, K), alt=predict.alt(m=kout, d=as.matrix(K))) 
sample_n(aux, 10)
    fit  native alt
1     0       0  -1
100   1       0   1
218   1       0   1
200   1       0   1
182   1       0   1
87    0       0  -1
183   1       0   1
174   1       0   1
94    1       0   1
165   1       0   1
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top