2017-01-06 3 views
2

Ich habe Schwierigkeiten, einen Weg zu finden, um die Gleichung für ein lineares SVM-Modell im Regressionsfall zu bekommen, da die meisten Fragen mit Klassifizierung befassen ... Ich habe es mit Caret-Paket passen .Gleichung der linearen SVM-Regressionslinie

1- univariaten Fall

set.seed(1) 
fit=train(mpg~hp, data=mtcars, method="svmLinear") 
plot(x=mtcars$hp, y=predict(fit, mtcars), pch=15) 
points(x=mtcars$hp, y=mtcars$mpg, col="red") 
abline(lm(mpg~hp, mtcars), col="blue") 

, die das Grundstück mit rot = aktueller, schwarz gibt = ausgestattet und blaue Linie ist klassisch Regression. In diesem Fall weiß ich, dass ich die SVM-Vorhersagelinie manuell aus 2 Punkten berechnen kann, aber gibt es eine Möglichkeit, die Gleichung direkt aus der Modellstruktur zu erhalten? Ich brauche eigentlich die Gleichung so y = a + b x (hier mpg =? +? * Hp) mit Werten im Originalmaßstab.

enter image description here

2-multivariate

gleiche Frage, aber mit zwei abhängigen Variablen (mpg~hp+wt) Danke,

Antwort

1

Ja, ich glaube, es gibt. Werfen Sie einen Blick auf this answer, die ähnlich ist, aber nicht die Caret-Bibliothek verwendet. Wenn Sie dem Beispiel svp = fit$finalModel hinzufügen, sollten Sie in der Lage sein, es fast genau zu verfolgen. Ich habe eine ähnliche Technik auf Ihre Daten angewendet. Ich skalierte die Daten so, dass sie gut auf die Grafik der Vektoren passten, da die Bibliothek die Daten zur Laufzeit skaliert.

require(caret) 

set.seed(1) 
x = model.matrix(data=mtcars, mpg ~ scale(hp)) #set up data 
y = mtcars$mpg 

fit=train(x, y, method="svmLinear") #train 

svp = fit$finalModel #extract s4 model object 

plot(x, xlab="", ylab="") 
w <- colSums(coef(svp)[[1]] * x[unlist(alphaindex(svp)),]) 
b <- b(svp) 
abline(b/w[1],-w[2]/w[1], col='red') 
abline((b+1)/w[1],-w[2]/w[1],lty=2, col='red') 
abline((b-1)/w[1],-w[2]/w[1],lty=2, col='red') 

enter image description here

Und Ihre zweite Frage:

x = model.matrix(data=mtcars, mpg ~ scale(hp) + scale(wt) - 1) #set up data 
fit=train(x, y, method="svmLinear") #train 

svp = fit$finalModel #extract s4 model object 

plot(x, xlab="", ylab="") 
w <- colSums(coef(svp)[[1]] * x[unlist(alphaindex(svp)),]) 
b <- b(svp) 
abline(b/w[1],-w[2]/w[1], col='red') 
abline((b+1)/w[1],-w[2]/w[1],lty=2, col='red') 
abline((b-1)/w[1],-w[2]/w[1],lty=2, col='red') 

enter image description here

bearbeiten

Die obige Antwort betrifft eine Grenze Plotten, nicht die lineare SVM-Regressionslinie. Um die Frage zu beantworten, besteht ein einfacher Weg, die Linie zu erhalten, darin, die vorhergesagten Werte zu extrahieren und die Regression zu zeichnen. Sie benötigen tatsächlich nur ein paar Punkte, um die Zeile zu erhalten, aber der Einfachheit halber habe ich den folgenden Code verwendet.

abline(lm(predict(fit, newdata=mtcars) ~ mtcars$hp), col='green')

oder

abline(lm(predict(fit) ~ mtcars$hp), col='green')

enter image description here

+0

OK @danielson Dank für die Eingabe wenn ich nicht zufrieden bin noch, was ich wirklich suchen, ist die * y = a + bx * (oder * y = a + b.x1 + c.x2 * im zweiten Fall) Gleichung der svm Regressionslinie, mit coef im Originalmaßstab ... etwas, das ich dem Klienten präsentieren kann ... (und in Ihrem Antwort Ich verstehe nicht, wie aus meinem ersten 2D-Plot ein 1-D-Plot wurde ohne y ..?) :-) – agenis

+0

Entschuldigung. Ich glaube, ich habe die Frage falsch verstanden, als ich die Entscheidungsgrenze festlegte. Die Modellkoeffizienten werden nicht im Objekt gespeichert, also wäre der schnellste/einfachste/sauberste Weg, um es zu erhalten, "Zusammenfassung (lm (Vorhersage (Fit) ~ mtcars $ hp))". Suchen Sie nach einer Methode, um die Koeffizienten direkt aus den Vektoren zu generieren? – danielson

+0

OK, die 'lm' auf dem vorhergesagten Vektor ist ein netter Trick. Hätte nicht gedacht, wenn das, danke das war was ich brauchte. Wenn du willst, kannst du das zu deiner Antwort hinzufügen und ich akzeptiere es – agenis

Verwandte Themen