请选择 进入手机版 | 继续访问电脑版
楼主: hubifeng?
6163 13

[R] 支持向量机及其R实现   [推广有奖]

副教授

68%

还不是VIP/贵宾

-

威望
0
论坛币
10467 个
通用积分
122.7759
学术水平
87 点
热心指数
86 点
信用等级
62 点
经验
496 点
帖子
662
精华
0
在线时间
1063 小时
注册时间
2010-12-7
最后登录
2022-6-21

hubifeng? 学生认证  发表于 2015-3-4 12:31:53 |显示全部楼层 |坛友微信交流群

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

    本文分为三个部分:第一部分为原理及概念说明;第二部分为方法评价及应用;第三部分为R实现及参数说明。


一、原理及概念说明




    支持向量机(SVM)是一种线性和非线性数据的分类方法,它使用非线性映射将原始数据映射到高维空间,在该空间内搜索最佳分离超平面。在线性可分的情况下,存在这样的超平面把空间中的类分开,并且该超平面与类的距离最大即最大边缘超平面,它等价于求解约束的凸二次最优化问题(在此不详述,请参考Reference),此时是在原输入空间(n维)内寻找最大边缘超平面;在线性不可分的情况下,可以允许个别样本分类错误,但需要借助非线性映射把原输入数据变换到高维空间,在该空间搜索最大边缘超平面(此时是线性的,可用二次最优化求解),将该超平面对应到原输入空间的非线性超平面。然而这个过程中的点积计算量极大,幸而二次最优化求解中含有训练元组的点积等价于核函数应用于原输入数据,这些核函数在原输入空间上产生非线性分类器,利用核函数不仅可以省略变换后数据元组上的点积计算,也避免了这种映射,此时仍在原输入空间计算,因此与非线性映射后的维度相比降低了不少。

    软边缘(Soft Margin):即线性不可分情况下,允许个别样本跑到其它类别之中。但要使用参数来权衡两端,一个是要保持最大边缘的分离,另一个要使这种破例不能太离谱。这种参数就是对错误分类的惩罚程度C。

    分离超平面(separating hyperplane):即将类进行分离的超平面,这样的超平面很多,而从超平面到其边缘的两侧距离最短且相等的超平面即为最大边缘超平面(Maximal Margin Hyperplane,MMH),它具有更高的泛化准确率,此时MMH到类的最近的训练元组即为支持向量(support vector)

    支持向量是最难分类(临界)的训练元组,给出了最多的分类信息,它定义了边缘及最大边缘超平面。因此,学习后的分类器的复杂度由支持向量数而不是数据维度刻画,SVM也不太容易过分拟合。过拟合的原因与不稳定性密切相关,改动一个或两个训练元组会引起大范围的决策边界的变化,但决策最大边缘超平面则相对比较稳定,只有当被增加或去除的训练元组是支持向量时,边缘才会变动。过度拟合的起因是边缘过分拟合。而支持向量通常只是训练元组中的极小部分,几乎不会发生过分拟合。

    即使数据维度很高,具有少量支持向量的SVM可以具有很好的泛化性能。利用支持向量数可计算SVM分类器的期望误差率的上界,同样独立于数据维度。

    支持向量机回归(SVR):是由SVM发展出来的回归方法,同样也有线性可分与不可分情况。与SVM的区别在于,目标是使预测误差最小化同时函数平面度最大化。这种权衡是通过设置参数C来控制。参数ε是在回归函数周围定义的一个管道,管道内的误差将被忽略。如果所有的训练元组都在宽度为2ε的管道内,算法输出一个位于最平的管道中央的函数,这个管道包含所有训练元组,这种情况下总误差为0。因此,ε控制了函数与训练元组的拟合程度。支持向量即在管道外或管道边缘的训练元组。


二、方法评价及应用

    SVM训练速度较慢;SVM能够对复杂的非线性边界建模,不容易过分拟合;SVM总能发现全局最优解。

    在实践中,不可能事先判定一个数据集是否线性可分,因此可以先假设数据可分并验证,如果不成立再假设数据不可分。

    如前所述,支持向量机可用于回归、分类和异常检验,前者即为支持向量机回归,后者为支持向量机分类。支持向量机应用在许多领域,包括手写数字识别、对象识别、演说人识别,以及基准时间序列预测检验。

    SVM的研究目标主要是提高训练和检验速度,使得SVM可以成为超大型数据集更可行的选择。其他问题包括,为给定的数据集确定最佳核函数,为多类问题找出更有效的方法。

本帖隐藏的内容

三、R实现及参数说明
kernlab包:
    函数ksvm()通过。Call接口,使用bsvm和libsvm库中的优化方法。对于分类,有C-SVM分类算法和v-SVM分类算法,同时还包括C分类器的有界约束的版本;对于回归,提供了ε-SVM回归算法和v-SVM回归算法;对于多类分类,有一对一(one-against-one)方法和原生多类分类方法。
e1071包:
    使用libsvm库中的优化方法。多分类通过一对一的投票机制(one-against-one voting scheme)实现。e1071包的tune()函数在指定的范围内选取合适的参数。
klaR包:
    klaR对库SVMlight进行了简单的包装,提供了函数svmlight()以分类,可视化。Svmlight()支持C-SVM进行分类,ε-SVM进行回归;以一对所有(one-against-all)进行多类分类。SVMlight支持高斯核,多项式,线性和sigmoid核。Svmlight()的参数形式为字符串形式。
svmpath包:
    svmpath包里的函数可用来选取支持向量机的cost参数C
rminer包
。。。


    核函数:
Linear:使用它的话就成为线性向量机,效果基本等价于Logistic回归。但它可以处理变量极多的情况,例如文本挖掘。
Polynomial:n次多项式核函数,适用于图像处理问题。选择n的好方法是从1(一个线性模型)开始,然后递增至估计误差不再改进为止。通常,相当小的数目就足够了。
Radial basis,高斯核函数,最流行易用的选择。参数包括了sigma,其值若设置过小,会有过度拟合出现。
Sigmoid:反曲核函数,多用于神经网络的激活函数。
实践中,核函数的选择一般并不导致结果准确率的很大差别(也有特例!)。

    软边缘参数C:
cost



  1. #(1)支持向量机(SVM):
  2. library(kernlab)
  3. irismodel <- ksvm(Species ~ ., data = iris,              
  4.                      type = "C-bsvc", kernel = "rbfdot",                    
  5.                      kpar = list(sigma = 0.1), C = 10,                    
  6.                      prob.model = TRUE)
  7. irismodel
  8. predict(irismodel, iris[c(3, 10, 56, 68, 107, 120), -5], type = "probabilities")

  9. #Ksvm支持自定义核函数。如
  10. k <- function(x, y) { (sum(x * y) + 1) * exp(0.001 * sum((x - y)^2)) }
  11. class(k) <- "kernel"
  12. data("promotergene")
  13. gene <- ksvm(Class ~ ., data = promotergene, kernel = k, C = 10, cross = 5)#训练
  14. gene

  15. #对于二分类问题,可以对结果用plot()进行可视化。例子如下
  16. x <- rbind(matrix(rnorm(120), , 2), matrix(rnorm(120, mean = 3), , 2))
  17. y <- matrix(c(rep(1, 60), rep(-1, 60)))
  18. svp <- ksvm(x, y, type = "C-svc", kernel = "rbfdot", kpar = list(sigma = 2))
  19. plot(svp)


  20. library(e1071)
  21. set.seed(1234)
  22. ind<-sample(2,nrow(iris),replace=TRUE,prob=c(0.7,0.3)) #70%为训练集 30%为测试集
  23. train<-iris[ind==1,]
  24. test<-iris[ind==2,]
  25. svm<-svm(train[,1:4],train[,5],type="C-classification",
  26.          cost=10,kernel="radial",probability=TRUE,scale=FALSE)
  27. pred<-predict(svm,test[,1:4],decision.values=TRUE)
  28. table(pred,test[,5])

  29. library(e1071)
  30. model <- svm(Species ~ ., data = iris,            
  31.                method = "C-classification", kernel = "radial",              
  32.                cost = 10, gamma = 0.1)
  33. summary(model)
  34. plot(model, iris, Petal.Width ~
  35.        Petal.Length, slice = list(Sepal.Width = 3,                              
  36.                                   Sepal.Length = 4))
  37. pre=predict(model, iris,type='class')
  38. table(pre,iris$Species)

  39. library("klaR")
  40. data("B3")
  41. Bmod <- svmlight(PHASEN ~ ., data = B3,                  
  42.                    svm.options = "-c 10 -t 2 -g 0.1 -v 0")
  43. predict(Bmod, B3[c(4, 9, 30, 60, 80, 120),              
  44.                    -1])

  45. #(2)支持向量回归(SVR):
  46. library(DMwR)
  47. library(nnet)
  48. data(algae)
  49. algae <- algae[-manyNAs(algae), ]
  50. clean.algae <- knnImputation(algae[,1:12],k=10)
  51. norm.data <- scale(clean.algae[,4:12]) #数据标准化

  52. library(e1071)
  53. model.svm <- svm(a1~., norm.data)
  54. preds <- predict(model.svm, norm.data)
  55. plot(preds~ scale(clean.algae$a1))

  56. library(rminer)
  57. set.seed(1234)
  58. svr<-fit(a1~., norm.data, model="svm")
  59. #利用模型进行预测
  60. norm.preds <- predict(svr, norm.data)
  61. #绘制预测值与真实值之间的散点图
  62. plot(norm.preds~ scale(clean.algae$a1))
  63. #计算相对误差
  64. (nmse2 <- mean((norm.preds-scale(clean.algae$a1))^2)/
  65.    mean((mean(scale(clean.algae$a1))- scale(clean.algae$a1))^2))
复制代码
Reference:
复杂数据统计方法——基于R的应用
数据挖掘:概念与技术
数据挖掘:实用机器学习技术

还需要加深理解的地方:

1,凸二次最优化问题

2,惩罚函数

3,支持向量回归


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:支持向量机 R实现 向量机 Separating logistic回归 支持向量机 R实现 SVM

已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
accumulation + 100 + 1 + 1 + 1 精彩帖子
niuniuyiwan + 60 + 60 + 5 + 5 + 5 精彩帖子

总评分: 经验 + 160  论坛币 + 60  学术水平 + 6  热心指数 + 6  信用等级 + 6   查看全部评分

本帖被以下文库推荐

jgw1213 发表于 2015-3-4 12:47:08 |显示全部楼层 |坛友微信交流群
学习一下 谢谢分享

使用道具

ReneeBK 发表于 2015-3-20 09:40:25 |显示全部楼层 |坛友微信交流群
  1. > library("klaR")
  2. > data("B3")
  3. > Bmod <- svmlight(PHASEN ~ ., data = B3,                  
  4. +                    svm.options = "-c 10 -t 2 -g 0.1 -v 0")
  5. Error in file(con, "r") : cannot open the connection
  6. In addition: Warning messages:
  7. 1: running command 'svm_learn -c 10 -t 2 -g 0.1 -v 0 _train_1.dat _model_1.txt' had status 127
  8. 2: In file(con, "r") :
  9.   cannot open file '_model_1.txt': No such file or directory
  10. > predict(Bmod, B3[c(4, 9, 30, 60, 80, 120),              
  11. +                    -1])
  12. Error in predict(Bmod, B3[c(4, 9, 30, 60, 80, 120), -1]) :
  13.   error in evaluating the argument 'object' in selecting a method for function 'predict': Error: object 'Bmod' not found
  14. >
复制代码

使用道具

ReneeBK 发表于 2015-3-20 09:42:40 |显示全部楼层 |坛友微信交流群
  1. > library(rminer)
  2. > set.seed(1234)
  3. > svr<-fit(a1~., norm.data, model="svm")
  4. > #利用模型进行预测
  5. > norm.preds <- predict(svr, norm.data)
  6. Error in .local(object, ...) : test vector does not match model !
  7. > #绘制预测值与真实值之间的散点图
  8. > plot(norm.preds~ scale(clean.algae$a1))
  9. Error in eval(expr, envir, enclos) : object 'norm.preds' not found
  10. > #计算相对误差
  11. > (nmse2 <- mean((norm.preds-scale(clean.algae$a1))^2)/
  12. +    mean((mean(scale(clean.algaea1))−scale(clean.algaea1))^2))
  13. Error in mean((norm.preds - scale(clean.algae$a1))^2) :
  14.   object 'norm.preds' not found
  15. >
复制代码

使用道具

hooli 在职认证  发表于 2015-3-25 10:03:25 |显示全部楼层 |坛友微信交流群
很好,学习一下,谢谢

使用道具

hooli 在职认证  发表于 2015-3-25 10:07:41 |显示全部楼层 |坛友微信交流群
谢谢!

使用道具

Handsen 发表于 2015-11-3 00:33:58 |显示全部楼层 |坛友微信交流群
楼主好人

使用道具

BlackHawk123 在职认证  发表于 2015-11-3 08:59:02 来自手机 |显示全部楼层 |坛友微信交流群
Thank you and have a nice day.

使用道具

MrShining 发表于 2016-5-8 22:56:01 |显示全部楼层 |坛友微信交流群
ReneeBK 发表于 2015-3-20 09:42
请问知道解决方法吗?我也是这个错误

使用道具

ilovetian 发表于 2016-5-19 13:07:02 |显示全部楼层 |坛友微信交流群
ReneeBK 发表于 2015-3-20 09:40
请问这个问题解决了吗?我也出现同样的错误了。

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-18 23:09