R语言数据分析与挖掘-神经网络与支持向量机_第1页
R语言数据分析与挖掘-神经网络与支持向量机_第2页
R语言数据分析与挖掘-神经网络与支持向量机_第3页
R语言数据分析与挖掘-神经网络与支持向量机_第4页
R语言数据分析与挖掘-神经网络与支持向量机_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

理解神经网络01102神经网络的R语言实现010103理解支持向量机0104支持向量机的R语言实现理解神经网络201PAGE3理解神经网络3人工神经网络对一组输入信号和一组输出信号之间的关系建模,使用的模型来源于人类大脑对来自感觉输入的刺激是如何反应的理解。就像大脑使用一个称为神经元(neuron)的相互连接的细胞网络来创建一个巨大的并行处理器一样,人工神经网络使用人工神经元或者节点(node)的网络来解决学习问题。从广义上讲,人工神经网络可应用于分类、数值预测,甚至是无监督的模式识别。人工神经网络最好应用于下列问题:输入数据和输出数据都很好理解或者至少相对简单,但其涉及输入到输出的过程是及其复杂的。作为一种黑箱方法,对于这些类型的黑箱问题,它们运行得很好。虽然有很多种不同的神经网络,但是每一种都可以由下面的特征来定义:

(1)激活函数(activationfunction):将神经元的净输入信号转换成单一的输出信号,以便进一步在网路中传播。

(2)网络拓扑(networktopology)(或结构):描述了模型中神经元的数量以及层数和它们连接的方式。

(3)训练算法(trainingalgorithm):指定如何设置连接权重,以便抑制或者增加神经元在输入信号中的比重。PAGE4激活函数4激活函数是人工神经元处理信息并将信息传递到整个网络的机制。激活函数的主要作用是提供网络的非线性建模能力,如不特别说明,激活函数一般而言是非线性函数。假设一个神经网络中仅包含线性卷积和全连接运算,那么该网络仅能够表达线性映射,即便增加网络的深度也依旧还是线性映射,难以有效对实际环境中非线性分布的数据建模。加入(非线性)激活函数之后,神经网络才具备了分层的非线性映射学习能力。因此,激活函数是深度神经网络中不可或缺的部分。常用激活函数有Identity(恒等函数)、Binarystep(单位跳跃函数)、Sigmoid(“S”形函数)、TanH(双曲正切函数)、ReLU(整流线性单元函数)等。接下来,我们详细了解下Sigmoid、TanH和ReLU激活函数的基本原理。PAGE5网络结构5神经网络的学习能力来源于它的拓扑结构(topology),或者相互连接的神经元的模式与结构。虽然有无数的网络结构形式,但是它们可以通过3个关键特征来区分:(1)层的数目。(2)网络中的信息是否允许向后传播。(3)网络中每一层内的节点数。拓扑结构决定了可以通过网络进行学习任务的复杂性。一般来说,更大、更复杂的网络能够识别更复杂的决策边界。然而,神经网络的效能不仅是一个网络规模的函数,也取决于其构成元素的组织方式。在一个神经网络中通常会分成这样几层:输入层(inputlayer)、隐藏层(hiddenlayer)和输出层(outputlayer)。神经网络的R语言实现602PAGE7神经网络的R语言实现7目前使用R语言构建神经网络主要包括nnet、neuralnet、AMOTE及RSNNS扩展包,这些扩展包均可以通过install.packages()命令进行在线安装。其中nnet提供了最常见的前馈反向传播神经网络算法;neuralnet提供了弹性反向传播算法和更多的激活函数形式;AMOTE则更进一步提供了更为丰富的控制参数,并可以增加多个隐藏层。前面三个扩展包主要基于BP神经网络,并未涉及到神经网络中的其他拓扑结构和网络模型。而RSNNS扩展包则提供了更多的神经网络模型。PAGE8nnet扩展包8nnet扩展包的nnet()函数实现了单隐藏层的前馈神经网络和多项对数线性模型。nnet()函数基本表达形式为:

nnet(x,y,weights,size,Wts,mask,

linout=FALSE,entropy=FALSE,softmax=FALSE,censored=FALSE,skip=FALSE,rang=0.7,decay=0,

maxit=100,Hess=FALSE,trace=TRUE,MaxNWts=1000,

abstol=1.0e-4,reltol=1.0e-8,...)参数参数说明size隐藏层中的神经元数,设置为0时,表示没有隐藏层Wts初始系数,如果不设定,则使用随机数设定linout如果等于TRUE,则模型的输出为连续实数,一般用于回归分析(目标变量为连续型);如果等于FALSE(默认取值),则模型输出为逻辑数据,一般用于分类分析(目标变量为离散型)。entropy损失函数是否采用交叉熵,FALSE(默认)表示损失函数采用误差平方和的形式rang初始权值设置maxit最大迭代次数iterations,默认为100次abstol和reltolskip是否跳过隐藏层,如果为FALSE(默认),则不跳过decay加权系数的衰减PAGE9neuralnet扩展包9neuralnet扩展包的neuralnet()函数可实现传统B-P网络和弹性B-P网络建模。函数基本表达形式为:neuralnet(formula,data,hidden=1,threshold=0.01,stepmax=1e+05,rep=1,startweights=NULL,learningrate.limit=NULL,learningrate.factor=list(minus=0.5,plus=1.2),learningrate=NULL,lifesign="none",lifesign.step=1000,algorithm="rprop+",err.fct="sse",act.fct="logistic",linear.output=TRUE,exclude=NULL,constant.weights=NULL,likelihood=FALSE)PAGE10AMORE扩展包10AMORE扩展包是一个更加灵活的包,该包实现了TAO稳健神经网络算法,对一些想自己训练算法的用户而言更有帮助。常用的函数包括创建网络的newff()函数和训练网络的train()函数。其中newff()函数的定义如下:newff(n.neurons,learning.rate.global,momentum.global,error.criterium,Stao,hidden.layer,output.layer,method)train(net,P,T,Pval=NULL,Tval=NULL,error.criterium="LMS",report=TRUE,n.shows,show.step,Stao=NA,prob=NULL,n.threads=0L)PAGE11RSNNS扩展包11StuttgartNeuralNetworkSimulator(SNNS)是德国斯图加特大学开发的优秀神经网络仿真软件,为国外的神经网络研究者所广泛采用。其手册内容极为丰富,同时支持友好的Linux平台。而RSNNS则是连接R语言和SNNS的工具,使用RSNNS的低级接口,SNNS中的所有算法的功能性和灵活性都能够访问。不仅如此,该包还包含了一个方便的高级接口,将最通用的神经网络拓扑和学习算法无缝集成到R语言中,包括mlp(多层感知器)、dlvq(动态学习向量化网络),rbf(径向基函数网络),elman(elman神经网络),jordan(jordan神经网络),som(自组织映射神经网络),art1(适应性共振神经网络)等等。其中mlp()函数用于创建一个多层感知器,并且对它进行训练,多层感知器是全连接的前馈神经网络,它可能是目前最通用的神经网络结构。其定义如下:mlp(x,y,size=c(5),maxit=100,initFunc="Randomize_Weights",initFuncParams=c(-0.3,0.3),learnFunc="Std_Backpropagation",learnFuncParams=c(0.2,0),updateFunc="Topological_Order",updateFuncParams=c(0),hiddenActFunc="Act_Logistic",shufflePatterns=TRUE,linOut=FALSE,outputActFunc=if(linOut)"Act_Identity"else"Act_Logistic",inputsTest=NULL,targetsTest=NULL,pruneFunc=NULL,pruneFuncParams=NULL,...)PAGE12基于神经网络进行类别预测-nnet包12首先利用nnet()函数对训练集构建神经网络模型,设置隐藏层的节点数为2,初始权值设置为0.1,加权系数的衰减为5e-4,最大迭代次数iterations为200。并调用summary()函数查看训练好的神经网络信息。>#训练神经网络模型>set.seed(1234)>library(nnet)>iris.nnet<-nnet(Species~.,data=train,size=2,+rang=0.1,decay=5e-4,maxit=200)>#调用summary()函数查看训练好的神经网络信息>summary(iris.nnet)a4-2-3networkwith19weightsoptionswere-softmaxmodellingdecay=0.0005b->h1i1->h1i2->h1i3->h1i4->h1-11.28-5.75-1.368.655.24b->h2i1->h2i2->h2i3->h2i4->h2-0.27-0.59-1.872.931.43b->o1h1->o1h2->o15.69-1.98-7.99b->o2h1->o2h2->o2-2.15-10.398.97b->o3h1->o3h2->o3-3.5412.37-0.99>#对生成的神经网络进行可视化>source('nnet_plot_update.r')>plot.nnet(iris.nnet)PAGE13基于神经网络进行类别预测-neuralnet包13利用neuralnet扩展包训练神经网络模型,如果是进行分类预测,在建模前需将因子型的因变量进行哑变量处理,接下来,调用neuralnet()函数训练神经网络模型,在建模过程中,除了指明类标号(setosa、versicolor和virginica)以及函数中训练的自变量,还人为规定了隐藏层的神经元的个数为3。模型构建好后,输出神经网络模型的结果矩阵result.matrix。>#对因子型的因变量进行哑变量处理>dmy1<-dummyVars(~.,data=train,levelsOnly=TRUE)>train_dmy<-predict(dmy1,newdata=train)>test_dmy<-predict(dmy1,newdata=test)>#训练神经网络模型>set.seed(1234)>library(neuralnet)>iris_neuralnet<-neuralnet(setosa+versicolor+virginica~+Sepal.Length+Sepal.Width+Petal.Length+Petal.Width,+data=train_dmy,hidden=3)#构建模型>iris_neuralnet$result.matrix#输出结果矩阵>plot(iris_neuralnet)#模型可视化PAGE14基于神经网络进行预测-AMORE包14现基于数据集iris,使用AMORE扩展包建立变量Sepal.Length、Sepal.Width、Petal.Length对Petal.Width预测的神经网络模型。>#回归问题的神经网络模型>iris1<-iris[,1:4]>#对前三列进行标准化>iris1[,1:3]<-apply(iris[,1:3],2,scale)>#加载AMORE包>library(AMORE)>#建立神经网络模型,输入层有3个神经元,输出层有一个神经元,这里增加了两个隐藏层,分别具有10,5个神经元。>newNet<-newff(n.neurons=c(3,10,5,1),+learning.rate.global=1e-4,+momentum.global=0.05,+error.criterium="LMS",+Stao=NA,+hidden.layer="sigmoid",+output.layer="purelin",+method="ADAPTgdwm")>#使用train函数,基于训练数据对神经网络进行训练>newNet.train<-train(newNet,iris1[,1:3],iris1[,4],+report=TRUE,show.step=100,n.shows=10)index.show:1LMS0.575364527367564index.show:2LMS0.573311933027616index.show:3LMS0.572403308700812index.show:4LMS0.571398559902228index.show:5LMS0.570292371448967index.show:6LMS0.56906195959584index.show:7LMS0.567680012232185index.show:8LMS0.566114145306589index.show:9LMS0.564325587734614index.show:10LMS0.562267513273799>#基于训练好的模型,对iris1进行预测,并计算均方误差>pred<-sim(newNet.train$net,iris1[,1:3])>error<-sqrt(sum(pred-iris1$Petal.Width)^2)>error[1]1.634289PAGE15基于神经网络进行类别预测-RSNNS包15现基于iris数据集,使用RSNNS扩展包的mlp()函数建立Sepal.Length、Sepal.Width、Petal.Length、Petal.Width对Species类别预测的神经网络模型。>library(RSNNS)>set.seed(12)>#准备数据>#将因变量进行哑变量处理>library(caret)>dmy<-dummyVars(~.,data=iris,levelsOnly=TRUE)>iris1<-predict(dmy,newdata=iris)>#将自变量进行标准化处理>iris1[,1:4]<-apply(iris[,1:4],2,scale)>#将数据进行分区>ind<-createDataPartition(iris$Species,p=0.8,list=FALSE)>train<-iris1[ind,]#训练集>test<-iris1[-ind,]#测试集>#使用mlp()函数,建立具有两个隐藏层,分别具有神经元数量为8,4的多层感知器网络>mlp.nnet<-mlp(train[,1:4],train[,5:7],size=c(8,4),learnFunc="Quickprop",+learnFuncParams=c(0.1,2.0,0.0001,0.1),maxit=100)>#利用上面建立的模型进行预测,得到预测概率矩阵>pred_prob=predict(mlp.nnet,test[,1:4])>head(pred_prob,3)[,1][,2][,3]10.90341820.090300570.00667131330.90339420.089007060.00670245990.90332280.086098760.006775069>#然后,通过找到概率最大的那一列,得到其他可能的类别>pred_class<-unique(iris[-ind,]$Species)[apply(pred_prob,1,which.max)]>#生成混淆矩阵,观察预测精度>table('actual'=iris[-ind,]$Species,+'prediction'=pred_class)predictionactualsetosaversicolorvirginicasetosa1000versicolor091virginica0010理解支持向量机1603PAGE17理解支持向量机17支持向量机(SupportVectorMachine,SVM)是个非常强大并且有多种功能的机器学习模型,能够做线性或者非线性的分类、回归、异常值检测。支持向量机是机器学习领域中最为流行的模型之一,是任何学习机器学习的人必备的工具。支持向量机特别适合应用于复杂但中小规模数据集的分类问题。其基本原理是将特征空间通过非线性变换的方式映射到一个高维的特征空间,并在这个高维空间中找出最优线性分界超平面的一种方法。支持向量机算法的工作原理就是找到一个最优的分界超平面,不仅需要这个分界超平面能够把两个类别的数据正确地分隔开来,还需要使这两类数据之间的分类间隔(Margin)达到最大。PAGE18理解支持向量机18

PAGE19软边界、核函数19支持向量机还有另外两个关键名词:软边界、核函数。(1)软边界(SoftMargin):在线性不可分情况下就要考虑软边界了。软边界可以破例允许个别样本跑到其他类别地盘去。但要使用参数来权衡两端,一个是要保持最大边缘的分离,另一个要使这种破例不能太离谱。这种参数就是对错误分类的惩罚程度C。(2)核函数(KernelFunction):为了解决完美分离的问题,SVM还提出一种思路,就是将原始数据映射到高维空间中去,直觉上可以感觉高维空间中的数据变的稀疏,有利于“分清敌我”。那么映射的方法就是使用“核函数”。如果“核函数”选择得当,高维空间中的数据就变得容易线性分离了。而且可以证明,总是存在一种核函数能将数据集映射成可分离的高维数据。常用的核函数有如下种类:①Linear:线性支持向量机,效果基本等价于Logistic回归。但它可以处理变量极多的情况,例如文本挖掘。②polynomial:多项式核函数,适用于图像处理问题。③Radialbasis,高斯核函数,参数包括了sigma,其值若设置过小,会有过度拟合出现。④sigmoid:反曲核函数,多用于神经网络的激活函数。支持向量机的目的是寻找一个超平面来对样本进行分割,分割的原则是边界最大化,最终转化为一个凸二次规划问题来求解。模型包括:(1)当训练样本线性可分时,通过硬边界(HardMargin)最大化,学习一个线性可分支持向量机。(2)当训练样本近似线性可分时,通过软边界(SoftMargin)最大化,学习一个线性支持向量机。(3)当训练样本线性不可分时,通过核技巧和软边界最大化,学习一个非线性支持向量机。支持向量机的R语言实现2004PAGE21支持向量机的R语言实现

21libsvm和SVMlight都是非常流行的支持向量机算法。在R语言中,来自维也纳理工大学统计系的e1071扩展包提供了libsvm的R语言接口;来自多特蒙德工业大学统计系的klaR扩展包提供了SVMlight的一个接口。e1071包R语言的e1071扩展包提供了libsvm的接口。使用e1071扩展包中svm()函数可以得到与libsvm相同的结果。write.svm()函数更是可以把训练得到的结果保存为标准的Libsvm格式,以供其他环境下libsvm的使用。kernlab包kernlab是R语言中实现基于核技巧机器学习的扩展包,可以通过install.packages(“kernlab”)命令进行在线安装。kernlab的算法群可以解决机器学习中分类、回归、奇异值检测、分位数回归、降维等诸多任务。kernlab扩展包还包括支持向量机,谱聚类、和主成分分析(KPCA)和高斯过程等算法。PAGE22基于支持向量机进行类别预测-线性可分22选取鸢尾花数据集iris中的变量Species因子水平为setosa或versicolor的样本,将利用e1071扩展包中的svm()函数建立自变量为Sepal.Width、Petal.Length对因变量Species的分类模型。>#构建数据子集>X<-iris[iris$Species!='virginica',2:3]#自变量:Sepal.Width,Petal.Length>y<-iris[iris$Species!='virginica','Species']#因变量>#构建支持向量机分类器>library(e1071)>svm.model<-svm(x=X,y=y,kernel='linear',degree=1,scale=FALSE)>summary(svm.model)Call:svm.default(x=X,y=y,scale=FALSE,kernel="linear",degree=1)Parameters:SVM-Type:C-classificationSVM-Kernel:linearcost:1NumberofSupportVectors:3(21)NumberofClasses:2Levels:setosaversicolorvirginica>svm.model$index#查看支持向量的序号[1]254299>svm.model$nSV#查看各类的支持向量个数[1]21>svm.model$SV#查看支持向量的自变量值

Sepal.WidthPetal.Length253.41.9422.31.3992.53.0PAGE23基于支持向量机进行类别预测-绘制决策边界23以下代码构建自定义函数plot_svc_decision_boundary(),用于绘制SVM分类器的判别边界实线、支持向量及最大间隔分类。>#绘制SVM分类器的判别边界实线、支持向量及最大间隔分类>plot_svc_decision_boundary<-function(svm.model,X){+w=t(svm.model$coefs)%*%svm.model$SV+b=-svm.model$rho+margin=1/w[2]+abline(a=-b/w[1,2],b=-w[1,1]/w[1,2],col="red",lwd=2.5)+points(X[svm.model$index,],col="blue",cex=2.5,lwd=2)+abline(a=-b/w[1,2]+margin,b=-w[1,1]/w[1,2],col="grey",lwd=2,lty=2)+abline(a=-b/w[1,2]-margin,b=-w[1,1]/w[1,2],col="grey",lwd=2,lty=2)+}>plot(X,col=y,pch=as.numeric(y)+15,cex=1.5)#绘制散点图>plot_svc_decision_boundary(svm.model,X)#增加决策边界和标注支持向量PAGE24基于支持向量机进行类别预测-软间隔24支持向量机能够通过最大化边界得到一个优化的超平面以完成对训练数据的分离,不过有时算法也允许被错分类样本的存在,惩罚因子能实现SVM对分类误差及分离边界的控制。如果惩罚因子比较小,分类间隔会比较大(软间隔),将产生比较多的被错分样本;相反当加大惩罚因子时,会缩小分类间隔(硬间隔),从而减少错分样本。svm()函数中可以通过参数cost来控制分类间隔的大小。下面代码对比cost值为1和100的分类间隔。>X=iris[iris$Species!='virginica',1:2]#"Sepal.Length""Sepal.Width">y=iris[iris$Species!='virginica','Species']>svm_samllC<-svm(x=X,y=y,cost=1,+kernel="linear",scale=FALSE)>svm_largeC<-svm(x=X,y=y,cost=100,+kernel="linear",scale=FALSE)>par(mfrow=c(1,2))>plot(X,col=y,pch=as.numeric(y)+15,main='smallcost')>plot_svc_decision_boundary(svm_samllC,X)>plot(X,col=y,pch=as.numeric(y)+15,main='largecost')>plot_svc_decision_boundary(svm_largeC,X)>par(mfrow=c(1,1))PAGE25基于支持向量机进行类别预测-线性不可分25虽然在许多情况下,线性SVM分类器是有效的,但有很多数据集并不是线性可分。一种处理非线性数据集方法是增加更多的特征,例如多项式特征,在某些情况下可以变成线性可分的数据。svm()函数中可通过参数kernel将核函数取值为“polynomial”实现。让我们在卫星数据集(moonsdatasets)测试一下效果。>moons<-read.csv('../data/moons.csv')>#编写绘制决策边界函数>visualize_classifier<-function(model,X,y,xlim,ylim,title){+x1s<-seq(xlim[1],xlim[2],length.out=200)+x2s<-seq(ylim[1],ylim[2],length.out=200)+Z<-expand.grid(x1s,x2s)+colnames(Z)<-colnames(X)+y_pred<-predict(model,Z,type='class')+y_pred<-matrix(y_pred,length(x1s))++filled.contour(x1s,x2s,y_pred,+nlevels=2,+col=RColorBrewer::brewer.pal(length(unique(y)),'Pastel1'),+key.axes=FALSE,+plot.axes={axis(1);axis(2);+points(X[,1],X[,2],pch=as.numeric(y)+16,col=as.numeric(y)+2,cex=1.5)+},+xlab=colnames(X)[1],ylab=colnames(X)[2]+)+title(main=title)+}>xlim<-c(-1.5,2.5)>ylim<-c(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论