得到线性SVM回归线的方程

时间:2017-01-06 01:50:54

标签: r regression svm r-caret linear

我很难找到一种方法来获得回归情况下线性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")

其中给出的图形为红色=实际,黑色=拟合,蓝色线条为经典回归。在这种情况下,我知道我可以从2个点手动计算SVM预测线,但有没有办法从模型结构直接得到方程?我实际上需要像这样的等式 y = a + b x(这里 mpg =?+?* hp ),其值为原始比例。

enter image description here

2-多元

相同的问题,但有2个因变量(mpg~hp+wt) 谢谢,

1 个答案:

答案 0 :(得分: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

你的第二个问题:

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回归线。要回答这个问题,获得这条线的一个简单方法是提取预测值并绘制回归图。实际上,您只需要几个点来获取该行,但为了简单起见,我使用了以下代码。

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

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

enter image description here