得到线性 SVM 回归线的方程
get equation of linear SVM regression line
我正在努力寻找一种方法来获得回归案例中线性 SVM 模型的方程,因为大多数问题都与分类有关...我已将其与 caret 包相匹配。
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+bx (此处 mpg=?+?*hp ),其值在原始比例中。
2-多元
同样的问题,但有 2 个因变量 (mpg~hp+wt
)
谢谢,
是的,我相信有。看一下 this answer,它很相似,但没有使用 caret 库。如果将 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')
你的第二个问题:
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')
编辑
以上答案涉及绘制边界,而不是线性 SVM 回归线。要回答这个问题,获得直线的一种简单方法是提取预测值并绘制回归图。你实际上只需要几个点就可以得到这条线,但为了简单起见,我使用了以下代码。
abline(lm(predict(fit, newdata=mtcars) ~ mtcars$hp), col='green')
或
abline(lm(predict(fit) ~ mtcars$hp), col='green')
我正在努力寻找一种方法来获得回归案例中线性 SVM 模型的方程,因为大多数问题都与分类有关...我已将其与 caret 包相匹配。
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+bx (此处 mpg=?+?*hp ),其值在原始比例中。
2-多元
同样的问题,但有 2 个因变量 (mpg~hp+wt
)
谢谢,
是的,我相信有。看一下 this answer,它很相似,但没有使用 caret 库。如果将 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')
你的第二个问题:
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')
编辑
以上答案涉及绘制边界,而不是线性 SVM 回归线。要回答这个问题,获得直线的一种简单方法是提取预测值并绘制回归图。你实际上只需要几个点就可以得到这条线,但为了简单起见,我使用了以下代码。
abline(lm(predict(fit, newdata=mtcars) ~ mtcars$hp), col='green')
或
abline(lm(predict(fit) ~ mtcars$hp), col='green')