使用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 效果 全部代 ...
随机推荐
- U盘直接读写(今天用到了)
#ifndef INVALID_SET_FILE_POINTER #define INVALID_SET_FILE_POINTER (DWORD)-1 #endif #define FILE_BEGI ...
- Websocket 临时参考网站
https://blog.csdn.net/SGuniver_22/article/details/74273839 https://www.zhihu.com/question/20215561 h ...
- 30. Insert Interval【LintCode by java】
Description Given a non-overlapping interval list which is sorted by start point. Insert a new inter ...
- GD32F450 200M时USB不稳定
使用GD32F450的demo修改usb驱动,发现120M和168M时正常,200M时很不稳定.怀疑USB时钟分频有问题,一查果然是,记录如下: 200M是库函数主时钟分频代码如下 static vo ...
- cygwin下安装NCL
1.安装cygwin 到cygwin官网https://www.cygwin.com/下载安装程序,setup-x86.exe,注意能下载这个安装程序, setup-x86_64.exe64位不支 ...
- 汇编程序返回dos
汇编程序返回dos有两种方式: 1. push ds sub ax,ax push ax ... ret 作用:一开始ds是指向psp的,在psp:0000处放着int 20h ...
- #《JAVA程序设计》 20155214 实验五 网络编程与安全
<JAVA程序设计> 20155214 实验五 网络编程与安全 实验内容 掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验要求 要求一 结对实现中缀表达式转后缀 ...
- 20155231 java实验一 Java开发环境的熟悉
20155231 java实验一 Java开发环境的熟悉 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程: 完成实验.撰写实验 ...
- # 20155236 2016-2017-2 《Java程序设计》第二周学习总结
20155236 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 对于类型.变量.运算符.流程控制等等的学习.在其中包含着基本的语法元素,还有基本的逻辑语句. ...
- 20145234黄斐《网络对抗技术》PC平台逆向破解
Shellcode注入 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢出,覆盖成为指向 shellcode的地址. ...