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

R 从svm拟合超平面绘制数据,r,svm,R,Svm,我使用svm找到了一个依赖于q的超平面最佳拟合回归,其中我有4个维度:x,y,z,q fit <- svm(q ~ ., data=data,kernel='linear') 我有一个数据的3d图,其中第四维是彩色的,使用plot3d。如何覆盖svm找到的超平面?如何绘制超平面?我想将回归超平面可视化。您写道: 我用svm找到了一个超平面最佳拟合回归 但根据: Call: svm(formula = q ~ ., data = data, kernel = "linear") Para

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

fit <- svm(q ~ ., data=data,kernel='linear')
我有一个数据的3d图,其中第四维是彩色的,使用plot3d。如何覆盖svm找到的超平面?如何绘制超平面?我想将回归超平面可视化。

您写道:

我用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
的默认值,您可能正在求解
分类
,因此,我将演示如何将其可视化以进行分类

假设有
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
我在这里明确地写了
type=C-classification
,只是为了强调我们想要做分类。
scale=FALSE
意味着我们希望
svm()
直接使用提供的数据运行,而不使用缩放数据(默认情况下是这样)。我这样做是为了将来的评估变得更简单

不幸的是,
svm_模型
没有存储边界面的方程(或者仅仅是它的法向量),所以我们必须对它进行评估。从中我们知道,我们可以使用以下公式评估此类权重:

w <- t(svm_model$coefs) %*% svm_model$SV
我们使用了
rgl
软件包,您可以旋转此图像并欣赏它:)


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

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

跳过Tanagra的第一节,直接进入第6节(第14页)。它有它的缺点,但它给出了使用R进行线性回归、SVR与ε回归和nu回归的例子。它还尝试演示tune()方法(但是可以做得更好,IMHO)


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

Um…1响应,1协变量:最佳拟合线。1个响应,2个协变量:最佳拟合平面。1个反应,3个协变量:?@joran:我会说答案是“小倍数”或coplot:假设我们有预测因子(x,y,z)和反应w,在多个子区(z1,z2),(z2,z3)中绘制(x,y,w)分割平面不过也不算微不足道。或者使用动态图形拉格比…我想知道,是谁减少了CodeGuy。即使是10维空间,这个问题也可以是我应该如何想象这个,等等。。此外,还有一些致力于高维可视化的出版物。@joran:考虑到分类环境,这并不奇怪。在二维平面中,可以有被一条线分割的正实例和负实例,因此有1个响应、2个预测值,并且可以根据这些结果是否为负/正(或0/1)结果对点进行着色。对于3个预测器,使用三维空间绘制预测器,可以根据响应对点进行着色或着色。换句话说,响应不需要增加代数维数。@CodeGuy,比如Max,我认为你在做分类,而不是回归。如果情况并非如此,请您将
str(数据)
summary(数据)
的输出包括在内。您好,非常感谢。然而,我想做一个回归。你能提供这方面的代码吗?再次感谢你
> svm_model <- svm(cl~x+y+z, t, type='C-classification', kernel='linear',scale=FALSE)
w <- t(svm_model$coefs) %*% svm_model$SV
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')