GRNN神经网络原理与matlab实现

news2024/9/25 3:25:24

1案例背景

1.1GRNN神经网络概述

        广义回归神经网络(GRNN Generalized Regression Neural Network)是美国学者 Don-ald F. Specht在1991年提出的,它是径向基神经网络的一种。GRNN具有很强的非线性映射能力和柔性网络结构以及高度的容错性和鲁棒性,适用于解决非线性问题。GRNN 在逼近能力和学习速度上较RBF网络有更强的优势,网络最后收敛于样本量积聚较多的优化回归面,并且在样本数据较少时,预测效果也较好。此外,网络还可以处理不稳定的数据。因此,GRNN 在信号过程、结构分析、教育产业,能源、食品科学、控制决策系统、药物设计、金融领域、生物工程等各个领域得到了广泛的应用。

1.2GRNN 的网络结构

        (1 )输入层
        输入层神经元的数目等 学习样本中输入向量的维数,各神经元是简单的分布单元,直接将输入变量传递给模式层。
        (2 )模式层
        模式层神经元数目等于学习样本的数目 ,各神 经元对应不 同的样本,模式层神经元传递函数为
        (3 )求和层
        求和层中使用两种类型神经元进行求和。

        (4)输出层

1.3 GRNN 的理论基础

        广义回归神经网络的理论基础是非线性回归分析,非独立变量Y相对于独立变量工的回归分析实际上是计算具有最大概率值的y。设随机变量x和随机变量y的联合概率密度函数为f(z,y),已知工的观测值为X,则y相对于X的回归,也即条件均值为

1.4运输系统货运量预测相关背景

        运输系统作为社会经济系统中的一个子系统,在受外界因素影响和作用的同时,对外部经济系统也具有一定的反作用,使得运输需求同时受到来自运输系统内外两方面因素的影响。作为运输基础设施建设投资决策的基础,运输需求预测在国家和区域经济发展规划中具有十分重要的作用,其中,由于货物运输和地方经济及企业发展的紧密联系,货运需求预测成为货运需求和经济发展关系研究中的一个重要问题。因此,作为反映货物运输需求的一项重要指标,货运量预测研究和分析具有较强的实际和理论意义。
        常用的货运量预测方法包括时间序列方法、移动平滑法、指数平滑法、随机时间序列方法、相关、回归分析法以及灰色预测方法和多种方法综合的组合预测方法等。这些方法大都集中在对其因果关系回归模型和时间序列模型的分析上,所建立的模型不能全面、科学和本质地反映所预测动态数据的内在结构和复杂特性,丢失了信息量。人工神经网络作为-种并行的计算模型,具有传统建模方法所不具备的很多优点:有很好的非线性映射能力,对被建模对象的先验知识要求不多,一般不必事先知道有关被建模对象的结构、参数、动态特性等方面的知识,只需给出对象的输入,输出数据,通过网络本身的学习功能就可以达到输人与输出的完全符合。
        在此情况下,国内一些学者将神经网络引入到货运量预测中来。但BP神经网络在用于函数逼近时,存在收敛速度慢和局部极小等缺点,在解决样本量少而且噪声较多问题时效果并不理想。GRNN在逼近能力、分类能力和学习速度方面具有较强优势,网络最后收敛于样本量积聚最多的优化回归面,并且在数据缺乏时效果也较好。网络可以处理不稳定的数据,因此本案例采用GRNN建立了货运量预测模型,并利用历史统计数据对货运量进行预测。

2模型建立

        根据货运量影响因素的分析,分别取国内生产总值(GDP)、工业总产值,铁路运输线路长度、复线里程比重、公路运输线路长度,等级公路比重﹑铁路货车数量和民用载货汽车数量8项指标因素作为网络输入,以货运总量﹑铁路货运量和公路货运量3项指标因素作为网络输出,构建 GRNN,由于训练数据较少,采取交叉验证方法训练GRNN神经网络,并用循环找出最佳的SPREAD。
        本案例中data. mat中共有p,t两组数据,又各含13组数据,代表了1996—2008年的货运量和与其相关的各个变量值。将p、t的前12组数据作为网络的训练数据,最后1组数据作为网络的预测数据,建立 GRNN 神经网络对货运量进行预测。

3 MATLAB实现

        GRNN网络的相关函数,其函数名称为newgrnn().该函数可用于设计一个广义回归神经网络。广义回归神经网络是RBF网络的一种,通常用于函数逼近,其调用格式为

net = newgrnn(P.T,SPREAD)

        其中,P为Q组输入向量组成的R*Q维矩阵;T为Q组目标分类向量组成的S*Q维矩阵;SPREAD为径向基函数的扩展速度,默认值为1。
        根据上面确定的网络输入和输出,利用1996—2007年某地的历史数据作为网络的训练样本,2008年的数据作为网络的外推测试样本。代码如下:

%% Matlab神经网络43个案例分析


 
%% 清空环境变量
clc;
clear all
close all
nntwarn off;

%% 载入数据
load data;
% 载入数据并将数据分成训练和预测两类
p_train=p(1:12,:);
t_train=t(1:12,:);
p_test=p(13,:);
t_test=t(13,:);
%% 交叉验证
desired_spread=[];
mse_max=10e20;
desired_input=[];
desired_output=[];
result_perfp=[];
indices = crossvalind('Kfold',length(p_train),4);
h=waitbar(0,'正在寻找最优化参数....');
k=1;
for i = 1:4
    perfp=[];
    disp(['以下为第',num2str(i),'次交叉验证结果'])
    test = (indices == i); train = ~test;
    p_cv_train=p_train(train,:);
    t_cv_train=t_train(train,:);
    p_cv_test=p_train(test,:);
    t_cv_test=t_train(test,:);
    p_cv_train=p_cv_train';
    t_cv_train=t_cv_train';
    p_cv_test= p_cv_test';
    t_cv_test= t_cv_test';
    [p_cv_train,minp,maxp,t_cv_train,mint,maxt]=premnmx(p_cv_train,t_cv_train);
    p_cv_test=tramnmx(p_cv_test,minp,maxp);
    for spread=0.1:0.1:2;
        net=newgrnn(p_cv_train,t_cv_train,spread);
        waitbar(k/80,h);
        disp(['当前spread值为', num2str(spread)]);
        test_Out=sim(net,p_cv_test);
        test_Out=postmnmx(test_Out,mint,maxt);
        error=t_cv_test-test_Out;
        disp(['当前网络的mse为',num2str(mse(error))])
        perfp=[perfp mse(error)];
        if mse(error)<mse_max
            mse_max=mse(error);
            desired_spread=spread;
            desired_input=p_cv_train;
            desired_output=t_cv_train;
        end
        k=k+1;
    end
    result_perfp(i,:)=perfp;
end;
close(h)
disp(['最佳spread值为',num2str(desired_spread)])
disp(['此时最佳输入值为'])
desired_input
disp(['此时最佳输出值为'])
desired_output
%% 采用最佳方法建立GRNN网络
net=newgrnn(desired_input,desired_output,desired_spread);
p_test=p_test';
p_test=tramnmx(p_test,minp,maxp);
grnn_prediction_result=sim(net,p_test);
grnn_prediction_result=postmnmx(grnn_prediction_result,mint,maxt);
grnn_error=t_test-grnn_prediction_result';
disp(['GRNN神经网络三项流量预测的误差为',num2str(abs(grnn_error))])
save best desired_input desired_output p_test t_test grnn_error mint maxt

 运行结果如下:

最佳spread值为0.5
此时最佳输入值为

desired_input =

   -1.0000   -0.8993   -0.7948   -0.5023   -0.2955   -0.0574    0.1602    0.6652    1.0000
   -0.9998   -1.0000   -0.1291   -0.0072    0.2070    0.3417    0.5137    0.7838    1.0000
   -1.0000   -0.8616   -0.4969   -0.4969    0.1950    0.3333    0.4465    0.6604    1.0000
   -1.0000   -0.5385   -0.0769    0.5385    0.2308    0.3846    0.3846    0.6923    1.0000
   -1.0000   -0.9429   -0.9175   -0.7778   -0.5937   -0.3270   -0.0286    0.5619    1.0000
   -1.0000   -1.0000   -1.0000   -0.5000   -0.3000   -0.2000    0.0000    0.5000    1.0000
    0.0141   -1.0000    0.0187    0.0187    0.2477    0.3682    0.4944    0.7735    1.0000
   -1.0000   -0.9211   -0.8826   -0.9563   -0.7786   -0.6099   -0.3042    0.2843    1.0000

此时最佳输出值为

desired_output =

   -1.0000   -0.9839   -0.9838   -0.7127   -0.4503   -0.2463    0.0126    0.5394    1.0000
   -1.0000   -0.9040   -0.8604   -0.6403   -0.3950   -0.2293   -0.0769    0.4116    1.0000
   -1.0000   -0.8020   -0.8042   -0.5446   -0.2471   -0.0500    0.0416    0.4693    1.0000

GRNN神经网络三项流量预测的误差为9959.185       1777.8231       14498.027

        由程序运行后的结果中看出,SPREAD值设置为0.5时,训练数据的预测较好。SPREAD值越小,网络对样本的逼近性就越强;SPREAD值越大,网络对样本数据的逼近过程就越平滑,但误差也相应增大。在实际应用时,为了选取最佳的SPREAD值,一般采取本案例中循环训练的方法,从而达到最好的预测效果。

4案例扩展

        GRNN神经网络和BP网络都可以用于货运量等的预测,但对具体的网络训练来说,GRNN需要调整的参数较少,只有一个SPREAD参数,因此可以更快地预测网络,具有较大的计算优势。下面将针对本案例数据,使用BP神经网络模型预测得出的流量数据。代码如下:

%% 以下程序为案例扩展里的GRNN和BP比较 需要load chapter8.1的相关数据
clear all
load best
n=13;
p=desired_input;
t=desired_output;
net_bp=newff(minmax(p),[n,3],{'tansig','purelin'},'trainlm');
% 训练网络
net.trainParam.show=50;
net.trainParam.epochs=2000;
net.trainParam.goal=1e-3;
%调用TRAINLM算法训练BP网络
net_bp=train(net_bp,p,t);
bp_prediction_result=sim(net_bp,p_test);
bp_prediction_result=postmnmx(bp_prediction_result,mint,maxt);
bp_error=t_test-bp_prediction_result';
disp(['BP神经网络三项流量预测的误差为',num2str(abs(bp_error))])

运行结果:

BP神经网络三项流量预测的误差为6967.20678      11142.5527      4156.17376

完整代码获取:

https://download.csdn.net/download/weixin_44209907/88142535

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/822684.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 JMeter 进行压力测试

一.前言 压力测试是每一个Web应用程序上线之前都需要做的一个测试&#xff0c;他可以帮助我们发现系统中的瓶颈问题&#xff0c;减少发布到生产环境后出问题的几率&#xff1b;预估系统的承载能力&#xff0c;使我们能根据其做出一些应对措施。所以压力测试是一个非常重要的步…

套接字通信(C/C++ 多线程)----基于线程池的并发服务器

&#xff08;一&#xff09;大家可以看我写的这三篇&#xff0c;了解一下&#xff1a; 基于linux下的高并发服务器开发&#xff08;第四章&#xff09;- 多线程实现并发服务器_呵呵哒(&#xffe3;▽&#xffe3;)"的博客-CSDN博客https://blog.csdn.net/weixin_4198701…

Jmeter如何添加插件

一、前言 ​ 在我们的工作中&#xff0c;我们可以利用一些插件来帮助我们更好的进行性能测试。今天我们来介绍下Jmeter怎么添加插件&#xff1f; 2023最新Jmeter接口测试从入门到精通&#xff08;全套项目实战教程&#xff09; 二、插件管理器 ​ 首先我们需要下载插件管理器j…

一个完整的http请求响应过程

一、 HTTP请求和响应步骤 图片来自&#xff1a;理解Http请求与响应 以上完整表示了HTTP请求和响应的7个步骤&#xff0c;下面从TCP/IP协议模型的角度来理解HTTP请求和响应如何传递的。 二、TCP/IP协议 TCP/IP协议模型&#xff08;Transmission Control Protocol/Internet Pr…

04、并发用户数该怎么计算

什么是并发&#xff1f; 我们假设上图中的这些小人是严格按照这个逻辑到达系统的&#xff0c;那显然&#xff0c;系统的绝对并发用户数是 4。如果描述 1 秒内的并发用户数&#xff0c;那就是 16。是不是显而易见&#xff1f;但是&#xff0c;在实际的系统中&#xff0c;用户通常…

若依框架 - 对二次封装数据分页

LsDistrictController /*** 查询地段列表*/ApiOperation("查询地段列表")GetMapping("/list")public TableDataInfo list(LsDistrict lsDistrict) {startPage();Map<String, List> map lsDistrictService.selectLsDistrictList(lsDistrict);if (Col…

java类和对象详解(1)

面向对象的初步认知 什么是面向对象 Java是一门纯面向对象的语言(Object Oriented Program, 简称OOP),在面向对象的世界里&#xff0c;一切皆为对象。面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。 用面向对象的思想来涉及程序&#xff0c;更…

AntdesignVue 时间设置为年份不回显问题解决

时间设置为年份回显时报如下错误 年份设置值后报value异常 解决方案 格式不一致导致的 moment格式化后是string类型&#xff0c;后台返回的是Number类型导致的&#xff0c;统一格式就会显示了

人工智能安全-3-噪声数据处理

0 提纲 噪声相关概述噪声处理的理论与方法基于数据清洗的噪声过滤主动式过滤噪声鲁棒模型1 噪声相关概述 噪声类型: 属性噪声:样本中某个属性的值存在噪声标签噪声:样本归属类别关于噪声分布的假设:均匀分布、高斯分布、泊松分布等。 标签噪声的产生原因: (1)特定类别…

Unity 引擎做残影效果——1、BakeMesh

Unity实现残影效果 大家好&#xff0c;我是阿赵。   这次来分享一下在Unity里面做残影的效果。   所谓的残影&#xff0c;就是在角色移动的过程中&#xff0c;留下一串残留的影子。 这种效果比较常出现在格斗游戏和动作游戏。   在Unity里面做残影&#xff0c;方法很多…

DSPM来袭!什么是数据安全态势管理

数据安全态势管理是一种保护云数据的方法&#xff0c;通过确保敏感数据始终具有正确的安全态势&#xff0c;无论其被复制或移动到何处。 那么&#xff0c;什么是DSPM&#xff1f;这是一个简单的例子&#xff1a; 假设您已经为云数据建立了出色的安全态势。在此示例中&#xf…

力扣 96. 不同的二叉搜索树

题目来源&#xff1a;https://leetcode.cn/problems/unique-binary-search-trees/description/ C题解&#xff1a;动归五部曲。 确定dp数组以及下标的含义。dp[i] &#xff1a; 1到i为节点组成的二叉搜索树的个数为dp[i]。确定递推公式。由于是二叉搜索树&#xff0c;我们可以…

vue实现 图片拖拽及鼠标滚轮放大缩小

效果&#xff1a; 代码实现 <template><div class"container"><divclass"image-container"mousewheel.stop"onMouseWheel"mousedown"onMouseDown"mousemove"onMouseMove"mouseleave"onMouseLeave&quo…

大文件传输的有效可用方式

如何传输大文件&#xff1f;大文件传输的方法有哪些&#xff1f;在互联网时代&#xff0c;速度就是效率。企业在生产过程中需要进行数据信息的交换、转移。这就涉及到大文件的传输。不同的行业都有大文件传输的需求。比如影视行业需要每天传输视频素材&#xff0c;一个视频可能…

第十三章 利用PCA简化数据

文章目录 第十三章 利用PCA简化数据13.1降维技术13.2PCA13.2.1移动坐标轴 13.2.2在NumPy中实现PCA13.3利用PCA对半导体制造数据降维 第十三章 利用PCA简化数据 PCA&#xff08;Principal Component Analysis&#xff0c;主成分分析&#xff09;是一种常用的降维技术&#xff0…

Error in v-on handler (Promise/async): “[object Object]“

解决方法&#xff1a;用try 和 catch 语句来处理 catch来接收try异常报错

Linux怎么设置软链接(ln命令)

在Linux中&#xff0c;软链接&#xff08;Symbolic Link&#xff09;&#xff0c;它可以指向另一个文件或目录。类似于Windows中的快捷方式。 主要作用&#xff1a;文件路径简化&#xff1a;通过创建软链接&#xff0c;可以将长而复杂的文件路径简化为一个易于记忆和使用的链接…

【大数据之Flume】四、Flume进阶之复制和多路复用、负载均衡和故障转移、聚合案例

1 复制和多路复用 &#xff08;1&#xff09;需求&#xff1a;使用 Flume-1 监控文件变动&#xff08;可以用Exec Source或Taildir Source&#xff09;&#xff0c;Flume-1 将变动内容传递给 Flume-2&#xff08;用Avro Sink传&#xff09;&#xff0c;&#xff08;用Avro Sou…

ES6基础知识九:你是怎么理解ES6中Module的?使用场景?

一、介绍 模块&#xff0c;&#xff08;Module&#xff09;&#xff0c;是能够单独命名并独立地完成一定功能的程序语句的集合&#xff08;即程序代码和数据结构的集合体&#xff09;。 两个基本的特征&#xff1a;外部特征和内部特征 外部特征是指模块跟外部环境联系的接口…

iMacros WebBrowser Component for .NET

iMacros WebBrowser Component for .NET 在几分钟内实现应用程序自动化 快速轻松地将iMacro集成到您的应用程序中。不需要单独的安装程序。 无缝集成 iMacros与您的.NET应用程序无缝集成&#xff0c;作为Microsoft WebBrowser控件的替代品。它甚至可以用作每个.NET应用程序中的…