R中关于神经网络的包:nnet、AMORE、neuralnet以及RSNNS
nnet
包提供了最常见的前馈反向传播神经网络算法,构建单隐层神经网络;
AMORE
包则进一步提供了更为丰富的控制参数,并可以增加多个隐层;
neuralnet
包的改进在于提供了弹性反向传播算法和更多的激活函数形式。
data(iris)
ind <- sample(2,nrow(iris),replace=T,prob=c(0.7,0.3))
trainSet <- iris[ind==1,]
testSet <- iris[ind==2,]
nnet(traindata,trainlable,size,rang=0.1,decay=5e-4,maxit=300)
#traindata:训练数据,注意这里的训练数据要去掉类标签
#trainlable:类别
#size:隐层神经元数目
#rang:初始化权值会在-rang和rang之间选择
#decay:权值衰减参数
#maxit:最大迭代次数
#生成类别的示性函数,把类别数值化才能计算误差(安装nnet包才有效)
library(nnet)
trainlable <- class.ind(trainSet$Species)
testlable <- class.ind(testSet$Species)
bpnet <- nnet(trainSet[,- 5],trainlable,size=3,rang=0.1,decay=5e-4,maxit=300)
输入层4个神经元(4个属性),隐层3个神经元,输出层3个神经元(3个类)
b:偏移(每个隐层结点有一个b,每个输出层结点有一个b)
输入层:i1,i2,i3,i4
隐层:h1,h2,h3
输出层:o1,o2,o3
权值
#给出训练集分类结果
trainpre<-predict(bpnet,trainSet[,-5])
#给出检验集的分类结果
testpre<-predict(bpnet,newdata=testSet[,-5])
table(testSet$Species,apply(testpre,1,function(x){
names(x)[which.max(x)]}))
#左边的是行(真实类标签),右边是列(预测列标签)
应用AMORE包中的三个函数实现ANN构建:
①newff
函数:实现构建ANN网络框架
②train
函数:实现网络学习过程,即权值训练过程;
③sim
函数:实现网络预测,对未知样本类别的推断。
trainattri <- trainSet[,-5] #训练样本特征信息
trainlabel <- trainSet[,5] #训练样本类别信息
T <- class.ind(trainlabel) #示性函数
netframe <- newff(n.neurons=c(dim(trainattri)[2],3,dim(T)[2]),# n.neurons:输入-隐层-输出层的神经元数目
learning.rate.global=1e-4, #学习速率
momentum.global=0.001, #动量因子
error.criterium="LMS", #误差预测方法
Stao=NA, #误差参数
hidden.layer="sigmoid", #隐层神经元激活函数
output.layer="sigmoid", #输出层神经元激活函数
method="ADAPTgdwm") #训练方法
bpnet <- train(netframe, #由netff构建的网络(框架)
trainattri, #训练样本的特征信息
T, #训练样本的类别信息
error.criterium="LMS",
report=T,n.shows=20,show.step=500)
#是否提供结果的图形信息或文字信息
#report=T的前提下,report的次数为20,每迭代500次报告一次(步长)
#训练总次数:n.shows*show.step
testattri <- testSet[,-5]
testlabel <- testSet[,5]
testPre <- sim(bpnet$net,testattri)
#由train函数生成的训练好权值的ANN模型,bpnet不是sim的操作对象,而是bpnet中的元素net
#bpnet是一个list,bpnet$net即bpnet[[1]]
#待检测的样本(行为样本,列为特征信息)