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

下载本文档

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

文档简介

第6章神经网络与支持向量机Part/

01支持向量机

支持向量机(SupportVectorMachine,SVM)是一种支持线性分类和非线性分类的二元分类算法。经过演进,现在也支持多元分类,被广泛地应用在回归以及分类当中。支持向量机支持向量机支持向量机可以简单地描述为对样本数据进行分类,真正对决策函数进行求解。首先,要找到分类问题中的最大分类间隔,然后确定最优分类超平面,并将分类问题转化为二次规划问题进行求解。线性可分支持向量机支持向量机支持向量机线性可分:如果在特征空间中存在一个超平面能够将特征空间中的实例分为两类,使得超平面的任意一侧的实例全部拥有同一种标签。若找不到这样的平面,则称为线性不可分。在线性可分的情况下,在超平面两侧所有样本点中,存在某点离该平面最近,则把这个最近的距离称为间隔。支持向量机(SupportVectorMachine,SVM)是一种有监督的学习方法,可以用于与分类和回归相关的数据分析任务。给定一组训练样本,每一个样本都带有各自的类别标签,支持向量机的训练目标就是构建一个分类模型,将空间中的不同类别的点用尽可能宽的间隔分开。支持向量机线性可分支持向量机核函数支持向量机用到了线性可分的假设。对于线性不可分的情形,可以借助核函数把低维空间中的点映射到高维空间,期望在低维空间中线性不可分的点在高维空间变得线性可分。选择核函数是为了可以完成样本点从低维空间到高维空间的变换。但是,在获得线性可分性能时,用户也不希望因此引入过高的计算开销。支持向量机中设计核函数时只要求它的内积形式可以用原空间中点的简单函数来计算。因此,高维空间中的超平面可定义为与空间中某个向量的点积为常数的点的集合。支持向量机e1071包中的svm()函数函数svm()返回的是一个SVM类中的对象,可以使用svm_model$labels查看。下面列出了对象中的部分属性:

(1)SV:发现的支持向量矩阵;(2)labels:分类模式下对应的标签;(3)index:输入向量中的支持向量索引。svm()函数的主要核函数包括:支持向量机支持向量机举例library

("e1071")attach

(iris)x

<-

subset

(iris,

select=-Species)

y

<-

Speciessvm_model

<-

svm

(Species

~

.,

data=iris)

#品种是其他属性的因变量subset()函数从iris中取出子集,第一个参数表示数据集,select是一个逻辑向量。svm_model默认调用的是最常用核函数之一的径向核radial。支持向量机分类效果>

pred

<-

predict

(svm_model,

x)

>

table

(pred,

y)

ypred

setosa

versicolor

virginica

setosa

50

0

0

versicolor

0

48

2

virginica

0

2

48

从分类效果可以看出,在versicolor和virginica中,各有两个样本被混淆。支持向量机取得的分类效果现在比决策树更好。支持向量机数据预处理plot

(svm_model,

iris,

Petal.Width

~

Petal.Length,

#因为iris数据包括四个属性,在二维图形中需要指定其余二维,才能显示区域边界

slice

=

list

(Sepal.Width

=

2,

Sepal.Length

=

4))从图中可以观察到支持向量(用×表示)的分布情况。因为把高维数据画在了二维平面上,而且间隔的选取对其他两个没有显示的维度的特定值设置的,所以图中的支持向量并不一定落在边界附近。支持向量机参数优化>

svm_model_after_tune

<-

svm

(Species

~

.,

data=iris,

kernel="radial",

cost=2,

gamma=0.8)>

summary

(svm_model_after_tune)>

pred

<-

predict

(svm_model_after_tune,x)

>

table

(pred,

y)

y

pred

setosa

versicolor

virginica

setosa

50

0

0

versicolor

0

49

0

virginica

0

1

50支持向量机对参数敏感。以radial核函数、损失系数2(表明了分类器对错误分类的容忍度。)以及核函数参数0.8训练出一个新的分类器。从混淆矩阵可以看出结果的改善。支持向量机Part/

02神经网络基本原理人工神经网络是在生物学中神经网络的启发下诞生了的。在生命科学中,神经网络是指动物大脑中一系列相互连接的神经元。信号通过神经元的轴突经过突触传递到其他神经元的树突上,这就是神经元之间的接口。当外界总的信号输入超过了一定的阈值,神经元则会沿着轴突传递信号。神经元就可以通过接口相互影响,共同发挥作用。神经网络原理神经元神经元是人工神经网络中的基本组成单位,在结构上受到了神经生物学中动物大脑神经元的启示。单个神经元的功能非常简单,只是把输入信号加权求和,再把结果传递给一个激活函数。一般地,激活函数会选择性地抑制住一部分神经元。典型的激活函数通常是非线性的。多个神经元相互连接就组成了一个神经网络。通过选择神经元的数量、结合方式,以及激活函数的形式,用户可以构造不同结构的神经网络。神经网络原理ReLU函数x

<-

seq

(-1,1,0.1)

#设置xrelu

<-

function

(x)

ifelse

(x

>

0,

x,

0)

#定义ReLU函数plot

(x,

relu(x),

type

=

"l")

#画出函数text

(0.6,

0.4,

"ReLU

(x)")

#添加文字说明神经网络原理多层感知器模型多层感知器一般由至少三层神经元组成,除了输入层与输出层之外,还至少包括一个被称为隐层的中间层。一般在多层感知器中使用全连接模式,也就是相邻层中的神经元节点互相连接。在相邻层的两个神经元ni和nj之间传输信号时,使用权重wij来定量表示这种连接关系。因为权重wij的大小是可以调节的,如果使用非线性激活函数,多层感知器可以逼近一些极其复杂的多变量函数。输入层隐层输出层神经网络原理反向传播算法前向传播:在神经网络中,信号从输入层到输出层逐层传播。如果连接每一层的权重都是已知的,根据输入信号就可以计算出输出信号。当权重未知时,需要根据输入和输出来估计权重,使得神经网络能刻画出输入和输出之间的映射。反馈机制:猜测一组权重作为初始值,前向传播信号计算出理论输出,再根据理论值与实际值的偏差,来修正权重。神经网络原理偏差估计反向传播:偏差信号从输出层到输入层逐层反向传递。把第i层的第j个神经元的偏差记作。使用梯度下降法更新对权重参数的估计。因为只有输出层的偏可以直接计算出来,在其他层中需要先得到估计偏差,才能用于修订参数。把下一层的偏差传递给上一层,用于偏差估计简化:神经网络原理梯度估计使用梯度下降的方法来求权重,需要首先得出梯度方向,也就是偏差对权重的偏导。把第i层的第j个神经元的偏差记作。

,。链式求导:选择步长,神经网络原理算法说明学习因子η对于算法的性能非常重要。因为神经网络中的优化目标函数不一定为凸,梯度下降法只能保证收敛到局部最优,不能保证全局最优。对于一般的应用而言,局部最优实际上已经能够具有实用性。神经网络原理R语言中的神经网络包包

名说

明nnet支持单隐层的前馈神经网络,可用于多项式对数线性模型neuralnet使用反向传播算法训练神经网络h2o包含支持H2O的R脚本功能RSNNS斯图加特神经网络模拟器的接口

tensorflowTensorFlow的接口deepnetR语言深度学习包darch支持深度架构和受限玻尔兹曼机的R语言包rnn实现循环神经网络的包MXNetR支持灵活高效GPU计算和深度学习的R语言包kerasKeras的R语言接口神经网络原理neuralnet包R语言中的neuralnet包支持神经网络的基本操作。安装与下载:install.packages

("neuralnet")library

("neuralnet")主要的神经网络建模函数为: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)

称说

明formula对需要拟合的模型形式的符号性描述data包含formula中所指定变量的数据框hidden一个整型数向量,表示每一个隐层中神经元的个数threshold数值型停止条件,误差函数偏导数的阈值stepmax训练神经网络的最大步长,如果到达了这个最大值,则停止训练rep神经网络训练的最大迭代次数startweights包含权重初始值的向量algorithm包含用于神经网络计算的算法名称的字符串,可选:backprop、rprop+、rprop–、sag或slr。backprop指反向传播算法act.fct代表可微的激活函数名称的字符串,logistic和tanh分别表示Logistic函数和双曲正切函数err.fct字符串,表示用于计算误差的可微函数,可选sse和ce,分别代表误差的平方和,以及交叉熵神经网络实践函数返回神经网络对象函数的返回值是一个nn类的对象,其属性如右表所示。

称说

明call与调用函数形式相匹配err.fct实际使用的误差函数act.fct实际使用的激活函数datadata参数net.result包含神经网络每一次迭代的结果列表weights包含神经网络每一次迭代所拟合权重的向量神经网络实践神经网络实践应用:非线性回归#生成1~100之间的50个均匀分布的随机数作为训练输入traininginput

<-

as.data.frame

(runif

(50,

min=1,

max=100))trainingoutput

<-

log

(traininginput)

#按列绑定输入输出构成训练集trainingdata

<-

cbind

(traininginput,trainingoutput)#设定训练数据的属性名colnames

(trainingdata)

<-

c

("Input","Output")先看一个使用神经网络实现简单非线性函数拟合的例子。首先,用均匀概率分布生成一些整数,并对它们求对数值。然后,再用神经网络做出拟合与预测。神经网络实践设计网络结构#网络包含输入层+隐层+输出层,隐层带有10个神经元#指定损失函数阈值threshold=0.01net.log

<-

neuralnet

(Output~Input,

trainingdata,

hidden=10,

threshold=0.01)print

(net.log)多层感知器,由输入层、输出层,以及一个隐层构成。隐层的节点数量设为10。函数中并没有指定激活函数,使用的是默认形式Sigmoid。可以使用net.log$act.fct来查看函数形式。神经网络实践泛型函数plot调用plot

(net.log)可以画出网络结构。虽然形式简陋,图中标出了训练后学习到的参数。神经网络实践测试神经网络#生成测试数据检验神经网络的预测性能testdata

<-

as.data.frame

((1:10)^2)#输入测试数据,让训练好的神经网络完成运算net.results<-compute(net.log,testdata)

#用更好的形式显示结果,分别列出测试输入、实际值、预测值niceoutput

<-

cbind

(testdata,

log(testdata),

as.data.frame

(net.results$net.result))colnames(niceoutput)

<-

c

("Input","Expected

Output","Neural

Net

Output")生成一组数据用于检验神经网络的效果。打印niceoutput,比较实际值与预测值,看一看偏差是否可以接受。神经网络实践应用:分类class.ind

<-

function(cl)

#输入cl是一个表示分类结果的向量

{

n

<-

length

(cl)

cl

<-

as.factor

(cl)

#把cl转换为因子型

x

<-

matrix

(0,

n,

length(levels(cl)))#生成值为0的初始矩阵

x[(1:n)

+

n*(unclass(cl)-1)]

<-

1

#匹配样本及类别

dimnames(x)

<-

list(names(cl),

levels(cl))

#设置每一列的名称

x

#返回处理好的矩阵

}在神经元中使用的都是数值型变量。首先需要把分类结果表示成数值作为训练集的期望输出。编写函数,把输入的类别向量转换成值为0或1的矩阵,如果元素值为1则表示那一行样本对应的类别为元素所在的列。神经网络实践输入数据的规范化处理normalize

<-

function(x)

#设计规范化函数normalize(){

num

<-

x

-

min(x)

denom

<-

max(x)

-

min(x)

return

(num/denom)}#规范化数据集iris_norm

<-

as.data.frame(lapply(iris[1:4],

normalize))不同的变量可能有不同的取值范围,这些取值范围之间存在非常大的差异。在对数据进行预处理时,编写的函数normalize()完成数据规范化工作。把数据统一为0~1之间的实数值。神经网络实践划分训练集与测试集set.seed

(1)index

<-

sample(nrow(iris),

nrow(iris)*0.7)iristrain

<-

iris_norm[index,]iristest

<-

iris_norm[-index,]#把测试集的分类结果用作class.ind

()的输入iristrain.label

<-

iris

[index,5]iristest.label

<-

iris

[-index,5]target

<-

class.ind

(iristrain.label)iris.train

<-

cbind

(iristrain,

target)按照70%对30%的比例把数据集分为训练集与测试集两个部分

温馨提示

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

评论

0/150

提交评论