绘制来自 svm 拟合的数据 - 超平面

Posted

技术标签:

【中文标题】绘制来自 svm 拟合的数据 - 超平面【英文标题】:Plotting data from an svm fit - hyperplane 【发布时间】:2011-12-22 11:28:06 【问题描述】:

我使用 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 图,其中第 4 维是颜色,使用 plot3d。如何覆盖 svm 找到的超平面?如何绘制超平面?我想可视化回归超平面。

【问题讨论】:

嗯....1 个响应,1 个协变量:最佳拟合线。 1 个响应,2 个协变量:最佳拟合平面。 1 个响应,3 个协变量:?. @joran:我会说答案是“小倍数”或 coplots:假设我们有预测变量 (x,y,z) 和响应 w,绘制 (x,y,w) 分割平面在区域 (z1,z2), (z2,z3) 的许多子图中......虽然不是微不足道的。或者使用动态图形 a la ggobi ... 我想知道,谁减去了 CodeGuy。甚至,如果它是 10 维的,这个问题可能意味着 我应该如何将其可视化,等等。此外,还有专门针对高维可视化的出版物。 @joran:考虑到分类上下文,这并不太奇怪也不太不寻常。在二维平面中,可以有由一条线分割的正实例和负实例,因此有 1 个响应、2 个预测变量,并且可以根据这些是负/正(或 0/1)对点进行着色结果。对于 3 个预测变量,3 维空间来绘制预测变量,并且可以根据响应对点进行着色或着色。换句话说,响应不需要增加代数维度。 @CodeGuy 和 Max 一样,我认为您是在进行分类,而不是回归。如果不是这种情况,您能否将str(data)summary(data) 的输出包括在内? 【参考方案1】:

你写道:

我使用 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 包做到了,您可以旋转此图像并享受它:)

【讨论】:

嗨,非常感谢。但是,我想做一个回归。你能为此提供代码吗?再次,非常感谢你【参考方案2】:

我自己刚开始使用 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 进行线性回归、使用 Epsilon 回归和使用 nu 回归的 SVR 的示例。它还尝试演示了 tune() 方法(但可以做得更好,恕我直言)。

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

【讨论】:

以上是关于绘制来自 svm 拟合的数据 - 超平面的主要内容,如果未能解决你的问题,请参考以下文章

如何绘制 SVM 分类超平面

支持向量机+sklearn绘制超平面

如何为 SVM One-Versus-All 绘制超平面?

R:如何在 ggplot2 中绘制 svm 的超平面和边距?

paper 123: SVM如何避免过拟合

如何在 scikit learn 中为多元回归绘制最佳拟合平面?