使用RStudio学习一个简单神经网络
数据准备
1.收集数据
UC Irvine Machine Learning Repository-Concrete Compressive Strength Data Set
把下载到的Concrete_Data.xls拷贝到R的工作目录,然后用Excel打开另存为concrete.cvs。
或者从这里下载:
http://files.cnblogs.com/files/yuananyun/concrete.rar
2.数据预处理
> setwd("F://R语言/练习/")
> concrete <- read.csv("concrete.csv")
> str(concrete)
数据中有九个属性变量,其中对应八个特性和一个期望输出(用于验证预测结果)。
数据归一化
> normalize <- function(x){ return ((x-min(x))/(max(x)-min(x)))}
> concrete_norm <- as.data.frame(lapply(concrete,normalize))
as.data.frame是一个通用的方法很多功能,用户和包可以提供进一步的方法。
如果提供一个列表,每个元素都被转换为数据框中的一列。同样,矩阵的每一列分别被转换。
数据分割
我们把concrete_norm分成训练数据集concrete_train(75%);测试数据集concrete_test(25%)
> concrete_train <- concrete_norm[1:773,]
> concrete_test <- concrete_norm[774:1030,]
我们将用训练数据集生成神经网络模型,并用测试数据集来评价检验。
3.生成训练模型
我们将使用R中的neuralnet包来生成一个前馈神经网络。
安装和载入需要的包
> install.packages("neuralnet")
> library(neuralnet)

我们首先训练一个简单的只包括一个隐含层的多层前馈神经网络模型:
> concrete_model <- neuralnet(strength ~ Cement+slag+ash+water+superplastic+coarseagg+fineagg+age,data=concrete_train)
我们现在来看看我们刚刚建立的模型:

在这个简单模型中,数据集的八个特性作为八个输入节点,然后接着一个简单的隐含层节点,最后一个输入节点表示预测的混泥土强度。图中每个连接的权重都已经标识出来了,其中蓝色的1节点表示偏置(bias)。图中也显示了训练的步骤数,采用的测量方法是SSE,这些测量数据对于评价模型性能非常重要。
4.评估模型的性能
上一步的网络图给了我们一个直观的表象,但是并没有给我们提供较多关于这个模型与我们的数据匹配程度的信息。我们将使用compute()函数来在测试数据集上进行预测计算。
> model_results <- compute(concrete_model,concrete_test[1:8])
> predicted_strength <- model_results$net.result
使用cor()函数来获取我们的预测值与实际值之间的线性关联度:
> cor(predicted_strength,concrete_test$strength)
下面是我本机的结果:
[,1]
[1,] 0.7142372144
关联度越接近1表明两个变量之间线性相关性越强。我们这个结果约为0.72,表明我们的预测结果和实际结果还是比较接近,即使我们是在仅有一个隐含层的情况下,下面我们将提高预测的性能。
5.提高模型的性能
我们这节看看如果我们把隐含层数目增加到5会发生什么奇迹。我们可以再次使用neuralnet()函数,把隐含层数目改成5。
> concrete_model2 <- neuralnet(strength ~ Cement+slag+ash+water+superplastic+coarseagg+fineagg+age,data=concrete_train,hidden=5)
我们再次看看生成的网络图:
> plot(concrete_model2)

从图中可以看到我们的Error已经降低了很多。此外,模型训练步骤数上升到了39302,难怪我们的模型变得复杂很多了。
我们使用同样的方法来验证一下模型的预测性能:
> model_results2 <- compute(concrete_model2,concrete_test[1:8])
> predicted_strength2 <- model_results2$net.result
> cor(predicted_strength2,concrete_test$strength)
[,1]
[1,] 0.7295445435
可以看到,我们的预测性能提高了。
最后,本文简单的介绍了如何使用R来编写一个简单的神经网络实例。任何预测模型都不能做到100%,神经网络模型也一样,为了提高预测的性能,我们可以加大隐含层的数目,但是这样会导致训练步骤增加,训练时间变长,模型变复杂。
使用RStudio学习一个简单神经网络的更多相关文章
- Python学习-一个简单的计时器
在实际开发中,往往想要计算一段代码执行多长时间,以下我将该功能写入到一个函数里面,仅仅要在每一个函数前面调用该函数就可以,见以下代码: #------------------------------- ...
- day-11 python自带库实现2层简单神经网络算法
深度神经网络算法,是基于神经网络算法的一种拓展,其层数更深,达到多层,本文以简单神经网络为例,利用梯度下降算法进行反向更新来训练神经网络权重和偏向参数,文章最后,基于Python 库实现了一个简单神经 ...
- 一个简单的servlet容器
[0]README 0.1)本文部分文字转自 “深入剖析Tomcat”,旨在学习 一个简单的servlet容器 的基础知识: 0.2)for complete source code, pleas ...
- tensorflow笔记(二)之构造一个简单的神经网络
tensorflow笔记(二)之构造一个简单的神经网络 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7425200.html ...
- Python实现一个简单三层神经网络的搭建并测试
python实现一个简单三层神经网络的搭建(有代码) 废话不多说了,直接步入正题,一个完整的神经网络一般由三层构成:输入层,隐藏层(可以有多层)和输出层.本文所构建的神经网络隐藏层只有一层.一个神经网 ...
- Openfire/XMPP学习之——一个简单的Smack样例
昨天讲了Openfire的搭建和配置,今天来讲一下Smack.如果对如何搭建和配置Openfire的,可以参考Openfire/XMPP学习之——Openfire的安装.配置. Smack是一个开源, ...
- Django 学习笔记之六 建立一个简单的博客应用程序
最近在学习django时建立了一个简单的博客应用程序,现在把简单的步骤说一下.本人的用的版本是python 2.7.3和django 1.10.3,Windows10系统 1.首先通过命令建立项目和a ...
- WCF学习——构建一个简单的WCF应用(一)
本文的WCF服务应用功能很简单,却涵盖了一个完整WCF应用的基本结构.希望本文能对那些准备开始学习WCF的初学者提供一些帮助. 在这个例子中,我们将实现一个简单的计算器和传统的分布式通信框架一样,WC ...
- QML学习笔记(五)— 做一个简单的待做事项列表
做一个简单的QML待做事项列表,能够动态添加和删除和编辑数据 GitHub:八至 作者:狐狸家的鱼 本文链接:QML学习笔记(五)— 做一个待做事项列表 主要用到QML:ListView 效果 全部代 ...
随机推荐
- 数据立方体(Cube)
如上图所示,这是由三个维度构成的一个OLAP立方体,立方体中包含了满足条件的cell(子立方块)值,这些cell里面包含了要分析的数据,称之为度量值.显而易见,一组三维坐标唯一确定了一个子立方. 多位 ...
- Windows系统Python 虚拟环境virtualenv安装
1.我们用pip安装virtualenv >pip3 install virtualenv 2.创建工程目录 >mkdir myproject 3.进入工程目录 >cd myproj ...
- 从零开始的Python学习Episode 14——日志操作
日志操作 一.logging模块 %(message)s 日志信息 %(levelno)s 日志级别 datefmt 设置时间格式 filename 设置日志保存的路径 level 设置日志记录的级别 ...
- [Golang学习笔记] 06 程序实体3 类型断言和类型转换
类型断言: 语法:<目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言<目标类型的值> := <表达式>. ...
- ArrayList 一个面试题
我们现在有一个集合,集合里面有100个随机数,获取其中的基数: //假设我们得到了100个随机数 List<Integer> lists = new RandomArrayList< ...
- jenkins自动打包部署linux
需要用到2个插件. git parameter:用于参数化构建时选择分支. Publish Over SSH:用于上传jar包和操作tomcat 1.先在系统设置添加要连接的linux服务器,使用用户 ...
- DOM练手讲解
先上代码,大家贴入看一下 <body> <select id="slc" size="7"></select> <in ...
- C++操作符优先级带来的错误
在刷LeetCode题目:190. 颠倒二进制位:颠倒给定的 32 位无符号整数的二进制位时,可以利用左移和右移操作符来实现数字翻转: 错误解法: class Solution { public: u ...
- fastdfs+nginx+image_filter安装与生成缩略图
fastdfs简介 类似google FS的一个轻量级分布式文件系统,纯C实现,支持linux.FreeBSD等UNIX系统: 只能通过API访问,不支持POXIS: 文件不分块存储,上传的文件和OS ...
- TW实习日记:第八天
今天早上主要是接着做昨天的微信端网页预览附件,听同事说当打包代码放入服务器上后,就不存在跨域问题了,也就懒得自己写接口了,那么就希望自己能一次过吧...结果写着写着,发现开发文档中关于预览文件的方法, ...