12.支持向量机

#####12 支持向量机#####
#支持向量机方法建立在统计学理论的VC维理论和结构风险最小远离基础上,根据有限样本在
#模型的复杂性和学习能力之间寻求最佳折中,以期获得的最好的推广能力。其中模型的复杂
#度指对特定训练样本的学习精度,学习能力是指无错误地识别任意样本的能力。

#统计学习的目标从经验最小化变为了寻求经验风险与置信风险之和最小化,即结构风险最小化。

#核函数,在样例线性不可分时,可以尝试使用核函数来将特征映射到高维,这样就可分了。
#如果原始特征内积为<x,z>,映射后为<φ(x),φ(z)>,那么核函数(Kernels)为:
#            K(x,z)=(φ(x)^T)φ(z)。

#####12.2 R中的实现#####
library(e1071)

#####12.2 核心函数#####

#1. svm()函数
#第一类函数使用格式
#svm(formula, dataNULL, ..., subset, na.action=na.omit, scale=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, seed=1L,
#..., subset, na.action=na.omit)

#在第一类中,formula代表函数模型的形式
#data代表在模型中包含的有变量的一组可选格式数据。

#在第二类中,x可以是一个数据矩阵,也可以是一个数据向量,同时也可以是一个稀疏矩阵。
#y是对于x数据的结果标签,既可以是字符向量也可以是数量向量。

#type是指建立模型的类别。支持向量机模型通常可以用作分类模型、回归模型或者异常检测模型。
#所以在svm()函数中的type可以取的值有:C-classification、nu-classification、
#one-classification、eps-regression、nu-regression。这5种类型中,前3种是针对于字符型结
#果变量的分类方式,其中第3种是逻辑判别,即判别结果输出所需判别的样本是否属于该类别,而
#后两种则是针对数量型结果变量的分类方式。

#kernel是指在模型建立过程中使用核函数:线性核函数liear(u'u)、多项式核函数polynomial(
#(λu'u+coef0)^degree)、径向基核函数(也称高斯核函数)radial basis(exp(-λ|u-v|^2))以及神
#经网络核函数sigmoid(tanh(λu'u+coef0))。

#degree参数是指核函数多项式内积函数中的参数,默认为3.
#gamma参数是指核函数中除线性内积函数以外的所有函数的参数,默认为1.
#coef0参数是指核函数中多项式内积函数与sigmoid内积函数中的参数,默认为0
#nu参数适用于nu-classification、one-classification、nu-regression回归类型中的参数。

#下面介绍svm()函数在对数据建立模型后输出的结果。
#SV即support vectors,就是支持向量机模型中最核心的支持向量。
#Index所包含的结果是模型中支持向量在样本数据中的位置,简而言之就是支持向量是样本数据的第
#几个样本。

#注意,利用svm()函数建立支持想立即模型时,使用标准化后的数据建立的模型效果更好。

#2. plot()函数
#将svm()函数所得支持向量机模型放入plot()函数,则可以生成一个来自于根据各个类别和支持向量
#机建立的支持向量分类模型的输入数据散点图,同时还可以绘制各个类别的分类图。

#plot(x, data, formula, fill=TRUE, grid=50, slice=list(), symbolPalette=Palette(), 
#     svSymbol="x", dataSymbol="o", ...)

#x是指利用svm()函数所建立的支持向量机模型
#data是指绘制支持向量机分类图所采用的数据,该数据格式应与模型建立过程中所使用的数据格
#式一致。
#formula参数是用来观察任意两个特征维度对模型分类的相互影响。
#fill参数为逻辑参数,可选值为TRUE与FALSE两类。当取TRUE时,所绘制的图像具有背景色,反
#之没有,该参数默认为TRUE。
#symbolPalette参数主要用于决定分类点一级支持向量的颜色。
#svSymbol参数主要决定支持向量的形状。
#dataSymbol参数主要决定数据散点图的形状。

#####12.2.3 数据集#####
data(iris)
summary(iris)
#Species鸢尾花三种类别,采集了三种花的四项基本特征,花萼的长度、花萼的宽度、花瓣的长度
#以及花瓣的宽度。

#####12.3 应用案例#####
library(e1071)
#第一种格式
model=svm(Species~.,data=iris)   #建立svm模型

#第二种格式
x=iris[,-5]                      #提取iris数据中除第5列以外的数据作为特征变量
y=iris[,5]                       #提取iris数据中的第5列数据做结果变量
model1=svm(x,y,kernel="radial", gamma=if(is.vector(x)) 1 else 1/ncol(x))
#核函数默认为高斯内积
#核函数gamma系数代表,如果特征向量是向量则gamma值取1,否则gamma值为特征向量个数的倒数。

#####12.3.3 结果分析#####
summary(model)                  #查看model模型的相关结果
summary(model1)
#其中SVM-Type项目说明本模型的类别为C分类器模型:SVM-Kernel项目说明模型所使用的核函数为
#C分类器模型;SVM-Kernal项目说明本模型所使用的核函数为高斯内积函数且核函数中参数gamma
#的取值为0.25;cost项目说明模型缺点的约束违反成本为1。
#在输出的结果中,对于该数据,模型找到了51个支持向量;第一类具有8个支持向量,第二类具有
#22个支持向量,第三类具有21个支持向量。最后说明了模型中的三个类别为setosa、versicolor
#和virginica。

#####12.3.4 预测判别#####
x=iris[,1:4]                   #确认需要进行预测的样本特征矩阵
pred=predict(model,x)          #根据模型model对x数据进行预测
pred[sample(1:150,8)]          #随机挑选8个预测结果进行展示
table(pred, y)                 #模型预测精度展示

#####12.3.5 综合建模#####
attach(iris)                   #将数据集iris按列单独确认为向量
x=subset(iris, select=-Species)#确定特征变量为数据集iris中除去Species的其他项
y=Species
type=c("C-classification","nu-classification","one-classification")#确定要使用的分类方式
kernel=c("linear","polynomial","radial","sigmoid") #确定要使用的核函数
pred=array(0,dim=c(150,3,4))   #初始化预测结果矩阵的三维长度分别为150,3,4
accuracy=matrix(0,3,4)         #初始化模型精确度矩阵的两维分别为3,4
yy=as.integer(y)               #为方便模型精度计算,将结果变量数量化为1,2,3
for(i in 1:3)                  #确认i影响维度代表分类方式
{
  for(j in 1:4)                #确认j影响维度代表核函数
  {
    pred[,i,j]=predict(svm(x,y,type=type[i],kernel=kernel[j]), x)
                               #对每一模型进行预测
    if(i > 2) accuracy[i,j]=sum(pred[,i,j]!=1)
    else    accuracy[i,j]=sum(pred[,i,j]!=yy)
  }
}
#if语句的使用是因为C-classification和nu-classification与one-classification的模型预测精
#度的计算方式不同。
dimnames(accuracy)=list(type,kernel)#确定模型精度度量的列名和行名
print(accuracy)                #展示各个模型预测错误的数量
#结果发现,C-classification与高斯核函数(radial)结合的模型判别错误最少。那么可以直接选择
#这个模型为最模型。
table(pred[,1,3], y)           #模型预测精度展示(混淆矩阵)

#####12.3.6 可视化分析#####
plot(cmdscale(dist(iris[,-5])),
     col=c("lightgray","black","grey")[as.integer(iris[,5])],
     pch=c("o","+")[1:150 %in% model$index + 1]) #绘制模型分类散点图
legend(2,-0.8, c("setosa","versicolor","virginica"),
       col=c("lightgray","black","grey"),lty=1)  #标记图例

#"+"表示支持变量,“o”表示普通样本点

#可以利用plot()函数对模型类别关于模型中任意两个特征向量的变动过程进行绘图
data(iris)
model=svm(Species~., data=iris)
plot(model,iris,Petal.Width~Petal.Length,fill=FALSE,
     symbolPalette=c("lightgray","black","grey"),svSymbol="+")
            #绘制模型类别关于花萼宽度和长度的分类情况
legend(1, 2.5, c("setosa","versicolor","virginica"), col=c("lightgray","black","grey"),lty=1)

#####12.3.7 优化建模#####
#根据之前的错误调整比重
wts=c(1,1,1)                    #确定模型各个类别的比重为1:1:1
names(wts)=c("setosa","versicolor","virginica")#确定哥哥比重对应的类别
model2=svm(x,y,class.weights=wts) #建立模型
#接下来适当提高类别versicolor和virginica的比重,观察对模型的预测精度是否有影响
wts=c(1,100,100)  #确定模型各类别的比重为1:100:100
names(wts)=c("setosa","versicolor","virginica")
model3=svm(x,y,class.weights=wts)
pred3=predict(model3,x)
table(pred3,y)
#结果显示,产生了正向影响,可以通过改变权重提高模型的预测精度
wts=c(1,500,500)
names(wts)=c("setosa","versicolor","virginica")
model4=svm(x,y,class.weights=wts)
pred4=predict(model4,x)
table(pred4,y)
#通过对权重的调整之后,全部预测正确。




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值