数据准备

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学习一个简单神经网络的更多相关文章

  1. Python学习-一个简单的计时器

    在实际开发中,往往想要计算一段代码执行多长时间,以下我将该功能写入到一个函数里面,仅仅要在每一个函数前面调用该函数就可以,见以下代码: #------------------------------- ...

  2. day-11 python自带库实现2层简单神经网络算法

    深度神经网络算法,是基于神经网络算法的一种拓展,其层数更深,达到多层,本文以简单神经网络为例,利用梯度下降算法进行反向更新来训练神经网络权重和偏向参数,文章最后,基于Python 库实现了一个简单神经 ...

  3. 一个简单的servlet容器

    [0]README 0.1)本文部分文字转自 “深入剖析Tomcat”,旨在学习  一个简单的servlet容器  的基础知识: 0.2)for complete source code, pleas ...

  4. tensorflow笔记(二)之构造一个简单的神经网络

    tensorflow笔记(二)之构造一个简单的神经网络 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7425200.html ...

  5. Python实现一个简单三层神经网络的搭建并测试

    python实现一个简单三层神经网络的搭建(有代码) 废话不多说了,直接步入正题,一个完整的神经网络一般由三层构成:输入层,隐藏层(可以有多层)和输出层.本文所构建的神经网络隐藏层只有一层.一个神经网 ...

  6. Openfire/XMPP学习之——一个简单的Smack样例

    昨天讲了Openfire的搭建和配置,今天来讲一下Smack.如果对如何搭建和配置Openfire的,可以参考Openfire/XMPP学习之——Openfire的安装.配置. Smack是一个开源, ...

  7. Django 学习笔记之六 建立一个简单的博客应用程序

    最近在学习django时建立了一个简单的博客应用程序,现在把简单的步骤说一下.本人的用的版本是python 2.7.3和django 1.10.3,Windows10系统 1.首先通过命令建立项目和a ...

  8. WCF学习——构建一个简单的WCF应用(一)

    本文的WCF服务应用功能很简单,却涵盖了一个完整WCF应用的基本结构.希望本文能对那些准备开始学习WCF的初学者提供一些帮助. 在这个例子中,我们将实现一个简单的计算器和传统的分布式通信框架一样,WC ...

  9. QML学习笔记(五)— 做一个简单的待做事项列表

    做一个简单的QML待做事项列表,能够动态添加和删除和编辑数据 GitHub:八至 作者:狐狸家的鱼 本文链接:QML学习笔记(五)— 做一个待做事项列表 主要用到QML:ListView 效果 全部代 ...

随机推荐

  1. 【python安装】Windows上安装和创建python开发环境

    1. 在 windows10 上安装python开发环境 Linux和Mac OS都自带python环境,但是Windows没有,所以需要自行安装. 第1步:访问 python官网,下载Windows ...

  2. Python 装饰器装饰类中的方法(转)

    def catch_exception(origin_func): def wrapper(self, *args, **kwargs): try: u = origin_func(self, *ar ...

  3. Bugku Crack it

    知识点:kali  john工具 不知道hashcat怎么样 一. 用winhex打开 发现右边有root:等信息,想到了linux系统,看了别人的wp,kali中有一个工具john可以破解密码 二. ...

  4. Django 中跨 app 创建外键、多对多引用的方法

    问题描述 我的 Django 项目中有两个 app. 在 PersonalCenter app下的 models.py 下定义了一个 Footprint 类: 在 LoginAndRegister a ...

  5. R语言学习笔记(二十四):plyr包的用法

    plyr 这个包,提供了一组规范的数据结构转换形式. Input/Output list data frame array list llply() ldply() laply() data fram ...

  6. 20155220 2016-2017-2 《Java程序设计》第10周学习总结

    20155220 2016-2017-2 <Java程序设计>第10周学习总结 教材内容学习总结 计算机网络编程概述 路由器和交换机组成了核心的计算机网络,计算机只是这个网络上的节点以及控 ...

  7. [BZOJ4002][JLOI2015]有意义的字符串-[快速乘法+矩阵乘法]

    Description 传送门 Solution 由于这里带了小数,直接计算显然会爆掉,我们要想办法去掉小数. 而由于原题给了暗示:b2<=d<=(b+1)2,我们猜测可以利用$(\fra ...

  8. Android开发笔记——ListView模块、缓存及性能

    ListView是Android开发中最常用的组件之一.本文将重点说明如何正确使用ListView,以及使用过程中可能遇到的问题. ListView开发模块 图片缓存 可能遇到的问题 一.ListVi ...

  9. 关于ExecuteNonQuery执行的返回值(SQL语句、存储过程)

    因为msdn中说返回受影响的行数: Executes a Transact-SQL statement against the connection and returns the number of ...

  10. java.lang.Boolean.valueOf(String s)

    简单说,就是s为true(这四个字母大小写任意)时,返回值为true,否则为false public class one { public static void main(String[] args ...