我使用svm找到一个取决于q的超平面最佳拟合回归,其中我有4个维度:x,y,z,q.
fit <- svm(q ~ ., data=data,kernel='linear')
Run Code Online (Sandbox Code Playgroud)
这是我的健康对象:
Call:
svm(formula = q ~ ., data = data, kernel = "linear")
Parameters:
SVM-Type: C-classification
SVM-Kernel: linear
cost: 1
gamma: 0.3333333
Number of Support Vectors: 1800
Run Code Online (Sandbox Code Playgroud)
我有一个我的数据的3d图,其中第四维是颜色,使用plot3d.如何覆盖svm发现的超平面?我如何绘制超平面?我想想象一下回归超平面.
Max*_*Max 38
你写了:
我使用svm找到超平面最佳拟合回归
但根据:
Call:
svm(formula = q ~ ., data = data, kernel = "linear")
Parameters:
SVM-Type: C-classification
Run Code Online (Sandbox Code Playgroud)
你在做分类.
所以,首先要确定你需要什么:分类或适合回归?svm,我们看到:
type: ‘svm’ can be used as a classification machine, as a
regression machine, or for novelty detection. Depending of
whether ‘y’ is a factor or not, the default setting for
‘type’ is ‘C-classification’ or ‘eps-regression’,
respectively, but may be overwritten by setting an explicit
value.
Run Code Online (Sandbox Code Playgroud)
由于我认为您没有将参数type从其默认值更改,您可能正在解决classification,因此,我将展示如何将其可视化以进行分类.
我们假设有2类,生成一些数据:
> require(e1071) # for svm()
> require(rgl) # for 3d graphics.
> set.seed(12345)
> seed <- .Random.seed
> t <- data.frame(x=runif(100), y=runif(100), z=runif(100), cl=NA)
> t$cl <- 2 * t$x + 3 * t$y - 5 * t$z
> t$cl <- as.factor(ifelse(t$cl>0,1,-1))
> t[1:4,]
x y z cl
1 0.7209039 0.2944654 0.5885923 -1
2 0.8757732 0.6172537 0.8925918 -1
3 0.7609823 0.9742741 0.1237949 1
4 0.8861246 0.6182120 0.5133090 1
Run Code Online (Sandbox Code Playgroud)
既然你想要kernel='linear'的边界必须是w1*x + w2*y + w3*z - w0- 超平面.我们的任务分为2个子任务:1)评估该边界平面的方程2)绘制该平面.
1)评估边界平面的方程
首先,让我们运行svm():
> svm_model <- svm(cl~x+y+z, t, type='C-classification', kernel='linear',scale=FALSE)
Run Code Online (Sandbox Code Playgroud)
我在这里明确写的type=C-classification只是强调我们想做分类.
scale=FALSE意味着我们希望svm()直接使用提供的数据运行而不缩放数据(默认情况下).我这样做是为了让未来的评估变得更简单.
不幸的是,svm_model不存储边界平面的方程(或者只是它的法向量),所以我们必须对它进行评估.从svm算法我们知道我们可以用以下公式评估这样的权重:
w <- t(svm_model$coefs) %*% svm_model$SV
Run Code Online (Sandbox Code Playgroud)
负截距存储在svm_model,并通过访问svm_model$rho.
2)绘图平面.
我没有找到任何有用的功能plane3d,所以,我们应该做一些方便的工作.我们只取对的网格(x,y)并评估z边界平面的适当值.
detalization <- 100
grid <- expand.grid(seq(from=min(t$x),to=max(t$x),length.out=detalization),
seq(from=min(t$y),to=max(t$y),length.out=detalization))
z <- (svm_model$rho- w[1,1]*grid[,1] - w[1,2]*grid[,2]) / w[1,3]
plot3d(grid[,1],grid[,2],z) # this will draw plane.
# adding of points to the graphics.
points3d(t$x[which(t$cl==-1)], t$y[which(t$cl==-1)], t$z[which(t$cl==-1)], col='red')
points3d(t$x[which(t$cl==1)], t$y[which(t$cl==1)], t$z[which(t$cl==1)], col='blue')
Run Code Online (Sandbox Code Playgroud)
我们用rgl包装做了,你可以旋转这个图像并享受它:)
