给定的训练样本集,分类学习的基本思想就是在样本空间中找到一个划分的超平面,将不同类别的样本分隔开。
支持向量机,因其英文名为support vector machine,故一般简称SVM,通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。
仍然是使用iris作为实验数据集
iris:数据源于1936年费希尔发表的一篇重要论文。彼时他收集了三种鸢尾花(分别标记为setosa、versicolor和virginica)的花萼和花瓣数据。包括花萼的长度和宽度,以及花瓣的长度和宽度。我们将根据这四个特征来建立支持向量机模型从而实现对三种鸢尾花的分类判别任务。
使用rstudio查看iris数据集内容:
在正是建模之前,可以通过图像来初步判断数据的分布情况
library(lattice)
png(file = "./Desktop/R/iris.png")
xyplot(Petal.Length ~ Petal.Width, data = iris, groups = Species, auto.key=list(corner=c(1,0)))
dev.off()
从图片可以看出setosa很容易与versicolor和virginica分隔开来,但是后两者分隔不明显,这次实验先选择setosa和versicolor来进行实验。
library(e1071)
subdata <- iris[iris$Species != 'virginica',]#l两分类方法
subdata$Species <- factor(subdata$Species) #将类别变为有序因子
model1 <- svm(Species ~ Petal.Length + Petal.Width, data = subdata)#花瓣长度与宽度做分类 formula:label ~ x + y
png(file = "./Desktop/R/svm1.png")
svm函数在e1071包里面包含,需要自行安装
formula代表的是函数模型的形式 formula:label ~ x + y
其中label为类型标签,x和y是分类的维度
需要注意的是,先要使用factor函数将类别变为有序因子才能作为svm的参数。
svm结果可视化:
png(file = "./Desktop/R/svm1.png")
plot(model1, subdata, Petal.Length ~ Petal.Width)
dev.off()
从结果中可以看出,两类通过一条线分割开来,这个例子是线性可分离的,事实上,大部分时候数据并不是线性可分的,这个时候满足这样条件的超平面就根本不存在。那对于非线性的数据SVM咋处理呢?对于非线性的情况,SVM 的处理方法是选择一个核函数 κ(⋅,⋅) ,通过将数据映射到高维空间,来解决在原始空间中线性不可分的问题。
使用summary来查看svm构建情况
summary(model1)
> summary(model1)
Call:
svm(formula = Species ~ Petal.Length + Petal.Width, data = subdata)
Parameters:
SVM-Type: C-classification
SVM-Kernel: radial
cost: 1
gamma: 0.5
Number of Support Vectors: 7
( 3 4 )
Number of Classes: 2
Levels:
setosa versicolor
SVM-Type项目说明本模型的类别为C分类器模型;SVM-Kernel项目说明本模型所使用的核函数为高斯内积函数且核函数中参数gamma的取值为0.5
还可以看到模型一共找到了7个支持向量,第一类包含3个支持向量那个,第二类包含4个支持向量。最后两行说明了两个类别以及每个类别的level
如果构建versicolor和virginica的svm,如下图所示: