从svm拟合 - 超平面绘制数据

时间:2011-11-05 01:08:51

标签: r svm

我使用svm找到一个取决于q的超平面最佳拟合回归,其中我有4个维度:x,y,z,q。

fit <- svm(q ~ ., data=data,kernel='linear')

这是我的健康对象:

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

我有一个我的数据的3d图,其中第四维是颜色,使用plot3d。如何覆盖svm发现的超平面?我如何绘制超平面?我想想象一下回归超平面。

2 个答案:

答案 0 :(得分:38)

您写道:

  

我用svm找到超平面最佳拟合回归

但根据:

Call:
svm(formula = q ~ ., data = data, kernel = "linear")

Parameters:
SVM-Type:  C-classification

您正在进行分类

所以,首先要确定你需要的东西:从?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.

由于我认为您没有将参数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

由于您希望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)

我在这里明确写了type=C-classification,只是为了强调我们想做分类scale=FALSE表示我们希望svm()直接使用提供的数据运行而不缩放数据(默认情况下)。我这样做是为了让未来的评估变得更简单。

不幸的是,svm_model没有存储边界平面的方程(或者只是它的法向量),所以我们必须对它进行评估。从svm-algorithm开始,我们知道我们可以使用以下公式评估此类权重:

w <- t(svm_model$coefs) %*% svm_model$SV

负截距存储在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')

我们使用rgl包完成了,您可以旋转此图片并享受它:)

enter image description here

答案 1 :(得分:1)

我刚开始使用R,但是有一个关于在R中使用e1071软件包进行回归而不是分类的好教程:

http://eric.univ-lyon2.fr/~ricco/tanagra/fichiers/en_Tanagra_Support_Vector_Regression.pdf

使用测试数据集和R脚本的zip文件:

http://eric.univ-lyon2.fr/~ricco/tanagra/fichiers/qsar.zip

跳过Tanagra的第一部分,直接前往第6部分(第14页)。它有其缺点,但它给出了使用R进行线性回归,使用ε回归进行SVR和使用nu回归的示例。它也试图演示tune()方法(但可以做得更好,恕我直言)。

(注意:如果您选择运行该论文中的示例,请不要试图找到xlsReadWrite的工作副本 - 将qsar.xls导出为.csv文件并使用起来要容易得多read.csv()加载数据集。)