2017-01-06 19 views
2

回帰の場合に線形SVMモデルの方程式を得る方法を見つけるのに苦労しています。なぜなら、質問の大部分は分類を扱うからです...私はそれをキャレットパッケージ。実際=赤フィット=黒、青のラインとのプロットを与える線形SVM回帰直線の方程式を得る

1-変量場合

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") 

は、古典的回帰です。この場合、私は手動でSVM予測線を2点から計算することができますが、モデル構造から方程式を直接得る方法はありますか?私は実際には、元の縮尺の値を持つy = a + b x(ここではmpg =?+?* hp)のような方程式が必要です。

enter image description here

2 - 多変量

同じ質問が、2つの従属変数(mpg~hp+wt) おかげで、

答えて

1

とはい、私はそこにあると信じています。 this answerを見てください。これは似ていますが、キャレットライブラリは使用していません。この例にsvp = fit$finalModelを追加すると、それをほぼ正確に追跡できるはずです。以下のデータにも同様の手法を適用しました。ライブラリが実行時にデータをスケーリングするので、ベクトルのプロットにうまく収まるようにデータをスケーリングしました。

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

そして、あなたの2つ目の質問:

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

編集

境界をプロット上記の解答の問題ではなく、線形SVM回帰直線である。質問に答えるには、線を得るための簡単な方法の1つは、予測値を抽出して回帰をプロットすることです。行を取得するには、実際には2点しか必要ありませんが、簡単にするために、次のコードを使用しました。

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

または

入力に感謝@danielson OK

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

enter image description here

+0

私は満足していない、まだ、私は本当にを探している*のY = A +ですが、 svm回帰線のbx *(または* y = a + b.x1 + c.x2 *)方程式、元の縮尺でcoef ...クライアントに提示できるもの...答え最初の2Dプロットが1次元プロットになった〜を使わずに?)):-) – agenis

+0

申し訳ありません。私は決定境界をプロットしていたので、私はその質問を誤解したと思う。モデル係数はオブジェクトに格納されないので、取得する最も簡単で簡単な方法は 'summary(lm(predict(fit)〜mtcars $ hp))'です。ベクトルから直接係数を生成する方法をお探しですか? – danielson

+0

OK、予測されるベクトル上の 'lm'は素敵なトリックです。これがあれば、私が必要だったことに感謝していませんでした。あなたがあなたの答えにこれを加えることができればそれを受け入れることができます – agenis