专栏首页生信小驿站R 支持向量机①

R 支持向量机①

机器学习

  • R语言有很多包可以做机器学习(Machine Learning)的任务。机器学习的任务主要有有监督的学习方式和无监督的学习方式。
  • 有监督学习:在正确结果指导下的学习方式,若是正确结果是定性的,属于分类问题;若正确结果是定量的,属于回归问题。
  • 无监督学习:在没有正确结果指导下的学习方式,例如:聚类分析、降维处理等

支持向量机

  • 支持向量机(Support Vector Machine,常简称为SVM)是一种监督式学习的方法,可广泛地应用于统计分类以及回归分析。支持向量机属于一般化线性分类器,这族分类器的特点是他们能够同时最小化经验误差与最大化几何边缘区,因此支持向量机也被称为最大边缘区分类器。
  • 支持向量机将向量映射到一个更高维的空间里,在这个空间里建立有一个最大间隔超平面。在分开数据的超平面的两边建有两个互相平行的超平面,分隔超平面使两个平行超平面的距离最大化。假定平行超平面间的距离或差距越大,分类器的总误差越小。
  • 假设给定一些分属于两类的2维点,这些点可以通过直线分割, 我们要找到一条最优的分割线,如何来界定一个超平面是不是最优的呢?

image

R包

  • R的函数包e1071提供了libsvm的接口。使用e1071包中svm函数可以得到与libsvm相同的结果。write.svm()更是可以把R训练得到的结果写为标准的Libsvm格式,以供其他环境下libsvm的使用。下面我们来看看svm()函数的用法。有两种格式都可以。
svm(formula,data=NULL,…,subset,na.action=na.omit,sacle=TRUE)

或者

svm(x, y = NULL, scale = TRUE, type = NULL, kernel =

"radial", degree = 3, gamma = if(is.vector(x)) 1 else 1 / ncol(x),

coef0 = 0, cost = 1, nu = 0.5,

class.weights = NULL, cachesize = 40, tolerance =0.001, epsilon = 0.1,

shrinking = TRUE, cross = 0, probability = FALSE,fitted = TRUE,

..., subset, na.action = na.omit)

参数详解

主要参数说明如下:

  • subset:可以指定数据集的一部分作为训练数据。
  • na.cation:缺失值处理,默认为删除缺失数据。
  • scale:将数据标准化,中心化,使其均值为0,方差为1,将自动执行。
  • type:svm的形式。为:C-classification ,nu-classification,one-classification(for novelty detection) ,eps-regression, nu-regression 五种形式。后面两者为做回归时用到。默认为C分类器。
  • kernel:在非线性可分时,我们引入核函数来做。默认为高斯核。顺带说一下,在kernel包中可以自定义核函数。
  • degree:多项式核的次数,默认为3
  • gamma:除去线性核外,其他核的参数,默认为1/数据维数
  • coef0:多项式核与sigmoid核的参数,默认为0.
  • cost:C分类中惩罚项c的取值
  • nu:Nu分类,单一分类中nu的值
  • cross:做k折交叉验证,计算分类正确性。
  • 代码
> if(!suppressWarnings(require(e1071)))
+ {
+   install.packages('e1071')
+   require(e1071)
+ }
> setwd("E:\\Rwork")
> data(iris)
> 
> ir<-iris
> 
> set.seed(123)
> 
> index <- sample(nrow(ir),0.75*nrow(ir))
> data_train <- ir[index,]
> data_test <- ir[-index,]
> sv<-svm(Species~.,data=data_train,cross=5,type='C-classification',kernel='sigmoid')
> 
> summary(sv)  #查看支持向量机sv的具体信息,发现做5倍交叉验证的正确率为92%

Call:
svm(formula = Species ~ ., data = data_train, cross = 5, type = "C-classification", kernel = "sigmoid")


Parameters:
   SVM-Type:  C-classification 
 SVM-Kernel:  sigmoid 
       cost:  1 
      gamma:  0.25 
     coef.0:  0 

Number of Support Vectors:  47

 ( 6 19 22 )


Number of Classes:  3 

Levels: 
 setosa versicolor virginica

5-fold cross-validation on training data:

Total Accuracy: 88.39286 
Single Accuracies:
 81.81818 95.45455 91.30435 86.36364 86.95652 



> 
> 
> pre<-predict(sv,data_test)#对测试样本作预测。pre是一个类别向量。
> 
> dim(data_test[data_test$Species!=pre,])[1]/dim(data_test)[1]#计算错误率
[1] 0.1315789


> table(pre,data_test$Species)
            
pre          setosa versicolor virginica
  setosa         11          0         0
  versicolor      0         10         2
  virginica       0          3        12


plot(sv, iris, Petal.Width ~
+        
+        Petal.Length, slice = list(Sepal.Width = 3,
+                                   
+                                   Sepal.Length = 4))

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • R语言绘制三线表

    在进行文章的撰写时,总是少不了一些表格的绘制,当然最标准的表格就是三线表了。我一般用word绘制三线表,但是R语言也可以且比较省时间。

    用户1359560
  • 单基因生信分析流程(3)一文解决生存分析和临床参数相关分析

    用户1359560
  • Python常见数据框操作①

    用户1359560
  • 爬虫入门一把搜

    # -*- coding:UTF-8 -*-import urllib.requestimport urllib.parseurl = 'http://fany...

    天钧
  • 关于css选择器的问题 + * ~这三个有什么区别

    杭州前端工程师
  • ABAP和Java里关于DEFAULT(默认)机制的一些语言特性

    由此可见新语法比较简洁,能少写3行代码。但是这样有一个缺陷,在新语法下如果it_data内表内不存在object_ext的值为cl_crm_prodil_bo_...

    Jerry Wang
  • BootstrapTable的列排序怎么搞

    先搞一个table,使用ajax将数据查询出来,然后可以在所有列都加上排序。满足自己的需求。

    别先生
  • Python中时间格式数据的处理

    1、时间转换 时间转换是指字符型的时间格式数据,转换成为时间型数据的过程。 一般从csv导入过来的文件,时间都保存为字符型格式的,需要转换。 时间转换函数: d...

    Erin
  • 讲讲切比雪夫定理

    前面讲了大数定理,讲了中心极限定理,有读者留言让讲讲切比雪夫定理,安排。这一篇就来讲讲切比雪夫定理。

    张俊红
  • 利用Phaser开发微信小游戏(排行榜小结)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明...

    bering

扫码关注云+社区

领取腾讯云代金券