目前使用R语言构建神经网络的包主要包括AMORE、NNET、Neuralnet及RSNNET等,其中AMORE包是一个比较灵活的神经网络包,且实现了TAO稳健神经网络算法,其常用的函数包括newff和train,前者定义神经网络结构,后者训练模型。
【实例详解】-以iris数据集为例
# 准备基础数据
source.Data <- iris[,1:4]
colnames(source.Data) <- c('x1','x2','x3','y')
# 归一化数据,只标准化连续变量可能会引起训练无法收敛,标准化函数为scale
# max.min <- function(x){
# (x-min(x))/(max(x)-min(x))
# }
# source.Data[,1:3] <- apply(source.Data[,1:3],2,max.min)
# 标准化数据
source.Data[,1:3] <- scale(source.Data[,1:3])
# 加载AMORE包
library(AMORE)
# 建立神经网络结构,输入层3个神经元,输出层一个神经元
# 三个隐含层,分别具有20,10,5个神经元
# learning.rate.global 为学习效率
# error.criterium为模型拟合评价标准
# hidden.layer 隐藏层激活函数,sigmoid为s型
# output.layer 输出层激活函数,purelin为线性
# method 训练方法,ADAPTgd为自适应梯度下降法
bp.net <- newff(n.neurons = c(3,20,10,5,1),
learning.rate.global = 0.01,
error.criterium = "LMS",
hidden.layer = "sigmoid",
output.layer = "purelin",
method = "ADAPTgd")
# 使用train函数,基于训练数据对神经网络进行训练
bp.net.train <- train(bp.net,P=source.Data[,1:(ncol(source.Data)-1)],T=source.Data[,ncol(source.Data)],
n.shows = 20,show.step = 1000)
# 基于现有的模型,拟合出y值,并计算残差平方和
y <- sim(bp.net.train$net,source.Data[,1:(ncol(source.Data)-1)])
error <- sum((y-source.Data[,ncol(source.Data)])^2)
error
# 输出结果
# [1] 5.351169
显然,此处BP神经网络的预测残差平方和显著低于单层感知器预测残差平方和(见我的上一篇笔记:https://bbs.pinggu.org/thread-5757745-1-1.html),说明模型有改进。
今天由于时间关系,此处只是套用R的AMORE包训练神经网络,下次自定义神经网络结果,观察训练过程。
参考:《R语言预测实战》-游皓麟