【机器学习与R语言】8- 神经网络
1.理解神经网络
1)基本概念
- 人工神经网络(ANN):对一组输入信号和一组输出信号之间的关系进行建模,模型来源于人类大脑对来自感觉输入刺激反应的理解。使用人工神经元或节点的网络来学习。
- 图灵测试:如果一个人不能把机器行为和一种生物行为区分开来,那么将该机器划分为智能类。
- ANN应用方法:分类/数值预测/无监督模式识别
- ANN应用场景:输入和输出好理解,但其过程很复杂(即黑箱方法)


n个输入神经元:

2)激活函数
- 单位跳跃激活函数:输入信号总和大于0,神经元才击破阈值

- S形激活函数(最常用的激活函数):输出信号不是二元的,而是0-1之间的某个值(可微的,因此可对整个输入范围求导)

- 其他激活函数:差异就在于输出信号的范围不同,一般是(0-1),(-1,1),(-∞,+∞)中的一种。

对于很多激活函数,影响输出信号的输入值范围是相对较窄的,比如上面S形激活函数影响输出信号(0,1)的输入信号范围(-5,5),存在输入信号压缩(也称为压缩函数),所以神经网络输入一般要做标准化,使特征值落在0附近的小范围内,这样模型训练也更快些。
3)网络拓扑
神经网络的学习能力来自它的拓扑结构:相互连接的神经元模式和结构。关键特征:
- 层的数目



- 信息传播方向
前馈网络:输入信号从上至下节点传送,直至输出层。应用广泛。
反馈网络(递归网络):允许信号使用循环在两个方向上传播。更贴近生物神经网络工作原理,使复杂模式被学习。停留在理论层面。
多层前馈网络(多层感知器,MLP):人工神经网络拓扑结构的事实标准。

- 每一层内的节点数
输入节点的个数由输入数据特征的数量预先确定,输出节点的个数由需要进行建模的结果或结果中分类水平数预先确定。隐藏节点的个数留给使用者在训练模型之前确定(无可信规则)。
较多数量的神经元训练更严格的模型,但易过拟合,且训练慢。最好是基于验证数据集,使用较少的节点产生适用的性能。
4)训练算法
通过调整连接权重训练神经网络模型的计算量非常大,因此一种后向传播误差的训练策略被发现。
目前,后向传播算法的多层前馈网络在数据挖掘领域很常见:

该算法通过两个过程的多次循环进行迭代。
两个过程:
- 前向阶段:输入层到输出层,沿途应用每个神经元的权重和激活函数,一旦到最后一层就产生一个输出信号。
- 后向阶段:前向阶段产生的输出信号与训练集中的真是目标值比较,两者的误差向后传播来修正神经元之间的连接权重,并减少将来的误差。
梯度下降法:利用每个神经元的激活函数的导数来确定每个输入权重方向上的梯度(因此一个可微的激活函数很重要,梯度因为权重的改变表明误差的急剧变化,后向传播算法通过学习率的量来改变权重来使得误差最大化减少)。
2.神经网络应用示例
使用人工神经网络对混凝土的强度进行建模。
1)收集数据
包含1030个混凝土案例,8个描述混合物成分的特征(与抗压强度相关)。
数据下载:
链接: https://pan.baidu.com/s/1Js-Asm479XYBjuCEXVF7Ng 提取码: 45fv
2)探索和准备数据
输入数据的标准化。注意如果数据服从一个钟形曲线(如正态分布),使用base::scale()函数才是有意义的。如果是均匀分布或严重非正态,则标准化到0-1水平会更合适。
## Example: Modeling the Strength of Concrete ----
## Step 2: Exploring and preparing the data ----
# read in data and examine structure
concrete <- read.csv("concrete.csv")
str(concrete)
# custom normalization function
normalize <- function(x) {
return((x - min(x)) / (max(x) - min(x)))
}
# apply normalization to entire data frame
concrete_norm <- as.data.frame(lapply(concrete, normalize))
# confirm that the range is now between zero and one
summary(concrete_norm$strength)
# compared to the original minimum and maximum
summary(concrete$strength)
# create training and test data
concrete_train <- concrete_norm[1:773, ] #75%
concrete_test <- concrete_norm[774:1030, ] #25%
训练模型前应用于数据的任何变换,之后需要应用反变换,以便将数据转换回原始的测量单位。
3)训练数据
可做神经网络的R包:neuralnet,nnet,RSNNS等。这里使用neuralnet包的同名函数来做,hidden参数即隐藏层默认为1。
## Step 3: Training a model on the data ----
# train the neuralnet model
library(neuralnet)
# simple ANN with only a single hidden neuron
set.seed(12345) # to guarantee repeatable results
concrete_model <- neuralnet(formula = strength ~ cement + slag +
ash + water + superplastic +
coarseagg + fineagg + age,
data = concrete_train)
# visualize the network topology
plot(concrete_model)
训练模型的网络拓扑结构可视化:

4)评估模型
评估模型是compute函数(而非predict),评估中包含网络中每一层的神经元和预测值这2个结果。
因为是数值预测而不是分类问题,所以不能用混淆矩阵来评估,可以用预测的强度和真实值的相关性来评估。
## Step 4: Evaluating model performance ----
# obtain model results
model_results <- compute(concrete_model, concrete_test[1:8])
# obtain predicted strength values
predicted_strength <- model_results$net.result
# examine the correlation between predicted and actual values
cor(predicted_strength, concrete_test$strength)

5)提高性能
考虑使用更复杂拓扑结构的网络学习,将隐藏节点个数增加到5来提高性能。
## Step 5: Improving model performance ----
# a more complex neural network topology with 5 hidden neurons
set.seed(12345) # to guarantee repeatable results
concrete_model2 <- neuralnet(strength ~ cement + slag +
ash + water + superplastic +
coarseagg + fineagg + age,
data = concrete_train, hidden = 5)
# plot the network
plot(concrete_model2)
# evaluate the results as we did before
model_results2 <- compute(concrete_model2, concrete_test[1:8])
predicted_strength2 <- model_results2$net.result
cor(predicted_strength2, concrete_test$strength)


机器学习与R语言系列推文汇总:
【机器学习与R语言】1-机器学习简介
【机器学习与R语言】2-K近邻(kNN)
【机器学习与R语言】3-朴素贝叶斯(NB)
【机器学习与R语言】4-决策树
【机器学习与R语言】5-规则学习
【机器学习与R语言】6-线性回归
【机器学习与R语言】7-回归树和模型树
【机器学习与R语言】8-神经网络
【机器学习与R语言】9-支持向量机
【机器学习与R语言】10-关联规则
【机器学习与R语言】11-Kmeans聚类
【机器学习与R语言】12-如何评估模型的性能?
【机器学习与R语言】13-如何提高模型的性能?
【机器学习与R语言】8- 神经网络的更多相关文章
- 【机器学习与R语言】13- 如何提高模型的性能?
目录 1.调整模型参数来提高性能 1.1 创建简单的调整模型 2.2 定制调整参数 2.使用元学习来提高性能 2.1 集成学习(元学习)概述 2.2 bagging 2.3 boosting 2.4 ...
- 【机器学习与R语言】9- 支持向量机
目录 1.理解支持向量机(SVM) 1)SVM特点 2)用超平面分类 3)对非线性空间使用核函数 2. 支持向量机应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高性能 ...
- 【机器学习与R语言】1-机器学习简介
目录 1.基本概念 2.选择机器学习算法 3.使用R进行机器学习 1.基本概念 机器学习:发明算法将数据转化为智能行为 数据挖掘 VS 机器学习:前者侧重寻找有价值的信息,后者侧重执行已知的任务.后者 ...
- 【机器学习与R语言】12- 如何评估模型的性能?
目录 1.评估分类方法的性能 1.1 混淆矩阵 1.2 其他评价指标 1)Kappa统计量 2)灵敏度与特异性 3)精确度与回溯精确度 4)F度量 1.3 性能权衡可视化(ROC曲线) 2.评估未来的 ...
- 【机器学习与R语言】11- Kmeans聚类
目录 1.理解Kmeans聚类 1)基本概念 2)kmeans运作的基本原理 2.Kmeans聚类应用示例 1)收集数据 2)探索和准备数据 3)训练模型 4)评估性能 5)提高模型性能 1.理解Km ...
- 【机器学习与R语言】10- 关联规则
目录 1.理解关联规则 1)基本认识 2)Apriori算法 2.关联规则应用示例 1)收集数据 2)探索和准备数据 3)训练模型 4)评估性能 5)提高模型性能 1.理解关联规则 1)基本认识 购物 ...
- 【机器学习与R语言】7-回归树和模型树
目录 1.理解回归树和模型树 2.回归树和模型树应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高模型性能 1.理解回归树和模型树 决策树用于数值预测: 回归树:基于到达 ...
- 【机器学习与R语言】6-线性回归
目录 1.理解回归 1)简单线性回归 2)普通最小二乘估计 3)相关系数 4)多元线性回归 2.线性回归应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高模型性能 1.理 ...
- 【机器学习与R语言】5-规则学习算法
目录 1.分类规则原理 1.1 1R单规则算法 1.2 RIPPER算法 2. 规则学习应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估性能 5)提高性能 6)选择决策树中的分类规则 ...
随机推荐
- 让全链路压测变得更简单!Takin2.0重磅来袭!
自Takin社区版1.0发布两个多月以来,有很多测试同学陆续在各自的工作中运用了起来,其中包括金融.电商.物流.出行服务等行业.这个过程中我们收到了很多同学的反馈建议,同时也了解到很多同学在落地全链路 ...
- pyinstaller和wordcloud和jieba的使用案列
一.pyinstaller库 1.简介 pyinstaller库:将脚本程序转变为可执行(.exe)格式的第三方库 注意:需要在.py文件所在目录进行以下命令,图标扩展名是.ico 2.格式: pyi ...
- MD支持程度测试
Editor.md 目录 (Table of Contents) [TOCM] 目录 Editor.md Heading 1 Heading 2 Heading 3 Heading 4 Heading ...
- 2021.9.17考试总结[NOIP模拟55]
有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...
- 六个好习惯让你的PCB设计更优
PCB layout工程师每天对着板子成千上万条走线,各种各样的封装,重复着拉线的工作,也许很多人会觉得是很枯燥无聊的工作内容.看似软件操作搬运工,其实设计人员在过程中要在各种设计规则之间做取舍,兼顾 ...
- Gitlab-CI使用及.gitlab-ci.yml配置入门一篇就够了
转载:Gitlab-CI使用及.gitlab-ci.yml配置入门一篇就够了 - 简书 (jianshu.com) 一. Gitlab-CI/CD使用场景 首先,公司使用Gitlab作为工作仓库进行代 ...
- hdu 2191 珍惜现在,感恩生活(多重背包)
题意: 有N元经费,M种大米,每种大米有单袋价格p元,单袋重量h,以及对应袋数c. 问最多可以买多重的大米. 思路: 经典多重背包,用二进制的方法. 看代码 代码: struct node{ int ...
- 羽夏看Win系统内核——保护模式篇
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- node 读取文件内容并响应
node 读取文件内容并响应 const http = require('http'); const fs = require('fs') //创建 Server const server = htt ...
- SQL里ORDER BY 对查询的字段进行排序,字段为空不想排在最前
在安字段排序时 空字段往往都是在最前,我只是想空字段在排序的后面,不为空的在前,这个如何修改呢 order by datatime desc 这样的句子也一样 不管是正排还是倒排 为空的都在最 ...