机器学习系列|R语言实践机器学习案例分享-神经网络的R语言实现
原创 小猫也想学生信 科研生信充电宝 2022-12-24 18:30 发表于上海
收录于合集
#神经网络2个
#机器学习97个
#r语言30个
#数据可视化110个
#数据分析88个
R语言实践
机器学习案例
R
神经网络的R语言实现
- 12·24-
宜分享
小编在这里祝大家平安夜快乐!
R语言实践机器学习案例迎来第十期啦~
前天的R语言实现ggplot2绘图中添加回归拟合线及其方程式的推送大受欢迎。有小伙伴留言说,能否再介绍一下R语言中的深度学习模型?
本期,为大家带来《神经网络的R语言实现》
1
理解神经网络模型
人工神经网络对一组输入信号和一组输出信号之间的关系建模,使用的模型来源于人类大脑对来自感觉输入的刺激是如何反应的理解。就像大脑使用一个称为神经元(neuron)的相互连接的细胞网络来创建一个巨大的并行处理器一样,人工神经网络使用人工神经元或者节点(node)的网络来解决学习问题。从广义上讲,人工神经网络可应用于分类、数值预测,甚至是无监督的模式识别。
人工神经网络最好应用于下列问题:输入数据和输出数据都很好理解或者至少相对简单,但其涉及输入到输出的过程是及其复杂的。作为一种黑箱方法,对于这些类型的黑箱问题,它们运行得很好。
虽然有很多种不同的神经网络,但是每一种都可以由下面的特征来定义:
-
激活函数(activation function):将神经元的净输入信号转换成单一的输出信号,以便进一步在网路中传播。
-
网络拓扑(network topology)(或结构):描述了模型中神经元的数量以及层数和它们连接的方式。
-
训练算法(training algorithm):指定如何设置连接权重,以便抑制或者增加神经元在输入信号中的比重。
- ① 激活函数 -
激活函数是人工神经元处理信息并将信息传递到整个网络的机制。激活函数的主要作用是提供网络的非线性建模能力,如不特别说明,激活函数一般而言是非线性函数。
假设一个神经网络中仅包含线性卷积和全连接运算,那么该网络仅能够表达线性映射,即便增加网络的深度也依旧还是线性映射,难以有效对实际环境中非线性分布的数据建模。
加入(非线性)激活函数之后,神经网络才具备了分层的非线性映射学习能力。因此,激活函数是深度神经网络中不可或缺的部分。
常用激活函数有:
-
Identity(恒等函数);
-
Binary step(单位跳跃函数);
-
Sigmoid(“S”形函数);
-
TanH(双曲正切函数);
-
ReLU(整流线性单元函数)等;
接下来,我们详细了解下Sigmoid、TanH和ReLU激活函数的基本原理。
# 常用激活函数
# ① 自定义Sigmoid函数
sigmod <- function(x){
return(1/(1+exp(-x)))
}
# 绘制Sigmoid曲线
x <- seq(-10,10,length.out = 100)
plot(x,sigmod(x),type = 'l',col = 'blue',lwd = 2,
xlab = NA,ylab = NA,main = 'Sigmoid函数曲线')
# ②自定义Tanh函数
tanh <- function(x){
return((exp(x)-exp(-x))/(exp(x)+exp(-x)))
}
# 绘制Tanh曲线
x <- seq(-10,10,length.out = 100)
plot(x,tanh(x),type = 'l',col = 'blue',lwd = 2,
xlab = NA,ylab = NA,main = 'Tanh函数曲线')
# ③ 自定义ReLU函数
relu <- function(x){
return(ifelse(x<0,0,x))
}
# 绘制ReLu曲线
x <- seq(-6,6,length.out = 100)
plot(x,relu(x),type = 'l',col = 'blue',lwd = 2,
xlab = NA,ylab = NA,main = 'ReLU函数曲线')
grid()
- ② 网络结构 -
神经网络的学习能力来源于它的拓扑结构(topology),或者相互连接的神经元的模式与结构。虽然有无数的网络结构形式,但是它们可以通过3个关键特征来区分:
-
层的数目;
-
网络中的信息是否允许向后传播;
-
网络中每一层内的节点数;
拓扑结构决定了可以通过网络进行学习任务的复杂性。一般来说,更大、更复杂的网络能够识别更复杂的决策边界。然而,神经网络的效能不仅是一个网络规模的函数,也取决于其构成元素的组织方式。
在一个神经网络中通常会分成这样几层:
-
输入层(input layer);
-
隐藏层(hidden layer);
-
输出层(output layer);
赞赏本文,即可解锁资哦~
神经网络的R语言实现
Brief Introduction
目前使用R语言构建神经网络主要包括:nnet、neuralnet、AMOTE及RSNNS扩展包,这些扩展包均可以通过install.packages()命令进行在线安装。
其中:
-
nnet包:提供了最常见的前馈反向传播神经网络算法;
-
neuralnet包:提供了弹性反向传播算法和更多的激活函数形式;
-
AMOTE包:则更进一步提供了更为丰富的控制参数,并可以增加多个隐藏层;
前面三个扩展包主要基于BP神经网络,并未涉及到神经网络中的其他拓扑结构和网络模型。而RSNNS扩展包则提供了更多的神经网络模型。
- ① nnet扩展包 -
nnet扩展包的nnet()函数实现了单隐藏层的前馈神经网络和多项对数线性模型。
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, ...)
其参数说明如下:
- ② neuralnet扩展包 -
neuralnet扩展包的neuralnet()函数可实现传统B-P网络和弹性B-P网络建模。
neuralnet()函数基本表达形式为:
# 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)
其参数说明如下:
- ③ AMORE扩展包 -
AMORE扩展包是一个更加灵活的包,该包实现了TAO稳健神经网络算法,对一些想自己训练算法的用户而言更有帮助。常用的函数包括创建网络的newff()函数和训练网络的train()函数。
创建网络的newff()函数定义如下:
# 创建网络的newff()函数定义如下:
newff(n.neurons, learning.rate.global, momentum.global, error.criterium, Stao,
hidden.layer, output.layer, method)
其参数说明如下:
训练网络的train()函数定义如下:
# 训练网络的train()函数定义如下:
train(net, P, T, Pval=NULL, Tval=NULL, error.criterium="LMS", report=TRUE,
n.shows, show.step, Stao=NA,prob=NULL,n.threads=0L)
其参数说明如下:
- ④ RSNNS扩展包 -
Stuttgart Neural Network Simulator(SNNS)是德国斯图加特大学开发的优秀神经网络仿真软件,为国外的神经网络研究者所广泛采用。其手册内容极为丰富,同时支持友好的 Linux 平台。而RSNNS则是连接R语言和SNNS的工具,使用RSNNS的低级接口,SNNS中的所有算法的功能性和灵活性都能够访问。
不仅如此,该包还包含了一个方便的高级接口,将最通用的神经网络拓扑和学习算法无缝集成到R语言中,包括:mlp(多层感知器)、dlvq(动态学习向量化网络), rbf(径向基函数网络), elman(elman神经网络), jordan(jordan神经网络), som(自组织映射神经网络), art1(适应性共振神经网络)等等。
其中mlp()函数用于创建一个多层感知器,并且对它进行训练,多层感知器是全连接的前馈神经网络,它可能是目前最通用的神经网络结构。
mlp()函数其定义如下:
# 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, ...)
其参数说明如下:
赞赏本文,即可解锁资哦~
神经网络的R语言实现实战
Brief Introduction
1
使用nnet包进行类别预测:
在本例中,我们将使用iris数据集作为例子。首先利用nnet()函数对训练集构建神经网络模型,设置隐藏层的节点数为2,初始权值设置为0.1,加权系数的衰减为5e-4,最大迭代次数iterations为200。并调用summary()函数查看训练好的神经网络信息。
① 导入数据:
# 导入和划分数据
set.seed(1234) # 设置随机种子
library(caret)
ind <- createDataPartition(iris$Species,p = 0.5,list = FALSE)
train <- iris[ind,] # 训练集
test <- iris[-ind,] # 测试集
② 利用nnet包训练神经网络模型:
# 训练神经网络模型
set.seed(1234)
library(nnet)
iris.nnet <- nnet(Species ~ ., data = train,size = 2,
rang = 0.1,decay = 5e-4,maxit = 200)
③ summary()函数查看训练好的神经网络信息:
# 调用summary()函数查看训练好的神经网络信息
summary(iris.nnet)
返回:
④ 可视化生成的神经网络:
# 对生成的神经网络进行可视化
source('nnet_plot_update.r')
plot.nnet(iris.nnet)
axis.title = element_text(size = 15))
⑤ 查看生成的神经网络模型:
iris.nnet$wts # 查看各节点的连接权重值
iris.nnet$value # 查看迭代结束时的损失函数值
head(iris.nnet$fitted.values) # 查看训练集各观测点的预测概率
返回:
⑥ 对test集进行预测并评价:
# 对test进行预测
iris_nnet_pred <- predict(iris.nnet,newdata = test,type = 'class')
(iris_nnet_pred_table <- table('actual' = test$Species,
'prediction' = iris_nnet_pred)) # 查看混淆矩阵
sum(diag(iris_nnet_pred_table)) / sum(iris_nnet_pred_table) # 查看模型准确率
返回:
2
使用neuralnet包进行类别预测:
在本例中,我们将使用iris数据集作为例子。利用neuralnet扩展包训练神经网络模型,如果是进行分类预测,在建模前需将因子型的因变量进行哑变量处理。接下来,调用neuralnet()函数训练神经网络模型,在建模过程中,除了指明类标号(setosa、versicolor和virginica)以及函数中训练的自变量,还人为规定了隐藏层的神经元的个数为3。模型构建好后,输出神经网络模型的结果矩阵result.matrix。
① 导入数据:
# 导入和划分数据
set.seed(1234) # 设置随机种子
library(caret)
ind <- createDataPartition(iris$Species,p = 0.5,list = FALSE)
train <- iris[ind,] # 训练集
test <- iris[-ind,] # 测试集
② 对因子型的因变量进行哑变量处理:
# 对因子型的因变量进行哑变量处理
dmy1 <- dummyVars(~.,data = train,levelsOnly = TRUE)
train_dmy <- predict(dmy1,newdata = train)
test_dmy <- predict(dmy1,newdata = test)
head(train_dmy,3)
head(test_dmy,3)
返回:
③ 利用neuralnet包训练神经网络模型:
# 训练神经网络模型
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) # 模型可视化
返回:
⑥ 对test集建立预测概率矩阵:
# 对test进行预测,生成相关的预测概率矩阵
iris_neuralnet_predict <- compute(iris_neuralnet,test_dmy[,1:4])$net.result
head(iris_neuralnet_predict,3)
返回:
⑦ 返回test集预测类别并评价模型:
# 得到可能的类别
iris_neuralnet_pred <- unique(test$Species)[apply(iris_neuralnet_predict,1,which.max)]
head(iris_neuralnet_pred,3)
(iris_neuralnet_pred_table <- table('actual' = test$Species,
'prediction' = iris_neuralnet_pred)) # 查看混淆矩阵
sum(diag(iris_neuralnet_pred_table)) / sum(iris_neuralnet_pred_table) # 查看模型准确率
返回:
3
使用AMORE包进行回归预测:
在本例中,我们将使用iris数据集作为例子。这里进行一个神经网络模型的回归分析的例子。基于数据集iris,使用AMORE扩展包建立变量Sepal.Length、Sepal.Width、Petal.Length对Petal.Width预测的神经网络模型。
① 导入数据并标准化:
# 回归问题的神经网络模型
iris1 <- iris[,1:4]
# 对前三列进行标准化
iris1[,1:3] <- apply(iris1[,1:3],2,scale)
② 利用AMORE包建立神经网络模型:
# 加载AMORE包
# 软件包“AMORE”已从CRAN存储库中删除,可以自行从存档中下载
# https://cran.r-project.org/src/contrib/Archive/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")
③ 利用AMORE包训练神经网络模型:
# 使用train函数,基于训练数据对神经网络进行训练
newNet.train <- train(newNet,iris1[,1:3],iris1[,4],
report = TRUE,show.step = 100,n.shows = 10)
④ 模型预测并评价:
# 基于训练好的模型,对iris1进行预测,并计算均方误差
pred <- sim(newNet.train$net,iris1[,1:3])
error <- sqrt(sum(pred-iris1$Petal.Width)^2)
error
返回:1.254529
4
使用RSNNS包进行类别预测:
在本例中,我们基于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,] # 测试集
③ 利用RSNNS包mlp()函数建立神经网络模型:
# 使用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)
④ test集的预测概率矩阵:
#利用上面建立的模型进行预测, 得到预测概率矩阵
pred_prob = predict(mlp.nnet,test[,1:4])
head(pred_prob,3)
返回:
② test集类别预测生成与混淆矩阵:
# 然后,通过找到概率最大的那一列,得到其他可能的类别
pred_class <- unique(iris[-ind,]$Species)[apply(pred_prob,1,which.max)]
#生成混淆矩阵,观察预测精度
table('actual' = iris[-ind,]$Species,
'prediction'= pred_class)
返回:
赞赏本文,即可解锁资哦~
总结
Brief Introduction
现在:
长按扫码关注:科研生信充电宝
10元赞赏本文,即喜欢作者~
即可直接解锁:
《神经网络的R语言实现》全套代码和源文件
看到这里你还不心动吗?
赶紧关注、转发、点赞、分享,领取你的专属福利吧~
好啦,以上就是今天推文的全部内容啦!
今天的分享就到这里啦~
另外,本公众号建立了R语言和Python学习分享群,联系后台,拉您入群。
版权声明:本文内容由互联网用户自发贡献,版权归作者所有,本公众号不拥有所有权,也不承担相关法律责任。
如果您发现本公众号中有涉嫌抄袭的内容,欢迎发送邮件至:kysxcdb@163.com 进行举报,一经查实,本公众号将立刻删除涉嫌侵权内容。
BIOINFOR
微信号|科研生信充电宝
· BIOINFOR ·
永远相信美好的事情
即将发生
小猫也想学生信
6 人喜欢
收录于合集 #神经网络
2个
上一篇机器学习系列|Python实践机器学习案例分享-多层神经网络MLPClassifier构建客户流失模型
阅读 791
分享收藏
116
分享此内容的人还喜欢
R学习|你还在用传统的LASSO回归可视化嘛?
1个朋友收藏
劝人学医TDLP
不喜欢
不看的原因
确定
- 内容质量低
- 不看此公众号
这篇被引用4000+次的文章解释了为什么研究论文不能只汇报p值!附R代码!
我关注的号
R语言和统计
不喜欢
不看的原因
确定
- 内容质量低
- 不看此公众号
机器学习(三)代价函数
云原生拓展
不喜欢
不看的原因
确定
- 内容质量低
- 不看此公众号