数据准备

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. JavaScript入门学习(2)--进度条

    <html> <style type="text/css"> #bar{width:0px; height:20px; background:#ee00ff ...

  2. ruby 记一次查看方法定义位置

    今天在回头看JSON类的时候,发现有一个语法特别诡异 JSON(str),一开始以为是一种类的特殊语法,结果问了群里大神才知道,就是定义了一个JSON(str)方法,但是我没有找到定义该方法的地方,问 ...

  3. 希尔伯特曲线——第八届蓝桥杯C语言B组(国赛)第三题

    原创 标题:希尔伯特曲线 希尔伯特曲线是以下一系列分形曲线 Hn 的极限.我们可以把 Hn 看作一条覆盖 2^n × 2^n 方格矩阵的曲线,曲线上一共有 2^n × 2^n 个顶点(包括左下角起点和 ...

  4. Oracle入门第一天(下)——数据库的管理

    一.SQL Developer的使用 常用设置,参考:https://www.cnblogs.com/biGpython/archive/2012/03/30/2424739.html https:/ ...

  5. linux编程实现pwd命令

    linux编程实现pwd命令 在linux中,一切皆文件.目录其实也是一种文件,只不过这种文件比较特殊,它里面存储的是一张对应表,即文件名和i节点的对应关系表,而i节点才是记录此文件详细信息的结构,如 ...

  6. 20155321 实验四 Android程序设计

    20155321 实验四 Android程序设计 安装Android studio成功 任务一:Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)( ...

  7. angular中的$http服务

    $http是ng内置的一个服务.是简单的封装了浏览器原生的XMLHttpRequest对象. 写法1 $http({ method: "GET", url: 'data.json' ...

  8. jquery.validate使用 - 4

    自定义错误消息的显示方式 默认情况下,验证提示信息用label元素来显示, 并且会添加css class, 通过css可以很方便设置出错控件以及错误信息的显示方式. /* 输入控件验证出错*/form ...

  9. Appium+python 自动发送邮件(2)(转)

    (原文:https://www.cnblogs.com/fancy0158/p/10056418.html) 移动端执行完测试case之后,通过邮件自动发送测试报告.大体流程如下: 1.通过unitt ...

  10. Java Basic&Security Tools

    JDK Tools and Utilities Basic Tools These tools are the foundation of the JDK. They are the tools yo ...