是的,我相信有。看一下this answer,它类似,但不使用caret库。如果您将svp = fit$finalModel
添加到示例中,您应该几乎可以完全按照它来操作。我在下面的数据中应用了类似的技术。我对数据进行了缩放,以便在向量图上很好地适合,因为库在运行时缩放数据。
require(caret)
set.seed(1)
x = model.matrix(data=mtcars, mpg ~ scale(hp))
y = mtcars$mpg
fit=train(x, y, method="svmLinear")
svp = fit$finalModel
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](https://istack.dev59.com/HYZvQ.webp)
而你的第二个问题:
x = model.matrix(data=mtcars, mpg ~ scale(hp) + scale(wt) - 1)
fit=train(x, y, method="svmLinear")
svp = fit$finalModel
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](https://istack.dev59.com/L3Uyk.webp)
编辑
上面的答案涉及绘制边界,而不是线性SVM回归线。要回答这个问题,一个简单的方法是提取预测值并绘制回归线。实际上,你只需要几个点就可以得到这条线,但为了简单起见,我使用了以下代码。
abline(lm(predict(fit, newdata=mtcars) ~ mtcars$hp), col='green')
或者
abline(lm(predict(fit) ~ mtcars$hp), col='green')
![enter image description here](https://istack.dev59.com/H7Ref.webp)
summary(lm(predict(fit) ~ mtcars$hp))
获取它。您是否正在寻找一种直接从向量生成系数的方法? - danielson