【MATLAB数据处理实用案例详解(14)】——利用RBF径向基网络预测地下水位

news2024/11/26 8:50:48

目录

    • 一、问题描述
    • 二、RBF径向基网络实现地下水位预测
    • 三、算法步骤
      • 3.1 定义数据样本
      • 3.2 划分训练数据与测试数据
      • 3.3 数据增强
      • 3.4 创建径向基神经网络
      • 3.5 测试
    • 四、结果展示
    • 五、完整代码

一、问题描述

地下水系统是一个复杂的非线性、随机系统。建立微分方程模型需要大量详尽的地下水文地质资料。这些实测数据往往很难获得。径向基函数网络训练速度快,具有很强的非线性映射能力,能够实现较高精度的地下水位预测。
由于预测的值是地下水的水位,因此输出的结果是一个标量,故输出层的神经元节点个数为1 。
采用了影响水位深度的5个因素作为自变量,分别为河道流量、气温、饱和差、降水量与蒸发量,形成函数关系:
y = f ( x 1 , x 2 , x 3 , x 4 , x 5 ) y = f\left( {{x_1},{x_2},{x_3},{x_4},{x_5}} \right) y=f(x1,x2,x3,x4,x5)

二、RBF径向基网络实现地下水位预测

MATLAB自带的神经网络工具箱提供了newrb函数,可以创建一个径向基神经网络。
在newrb函数创建的径向基网络中,隐含层的节点个数是不确定的。函数根据用户设置的误差目标,向网络中不断添加新的隐含层节点,并调整节点中心、标准差及权值,直到所得到的网络达到预期的误差要求。
本文使用newrb函数完成地下水水位的预测。
算法流程图如下:
在这里插入图片描述

三、算法步骤

3.1 定义数据样本

实验选择的是滦河某观测站24个月的地下数位实测序列值和5个影响因子的实测值,5个影响因子分别是:气温、饱和差、降水量、蒸发量和水位。
输入向量定义为524的矩阵,目标输出值为124行向量 :

% 输入
x = [ 1.5, 1.8, 4.0, 13.0, 5.0, 9.0, 10.0, 9.0, 7.0, 9.5, 5.5, 12.0,...
    1.5, 3.0, 7.0, 19.0, 4.5, 8.0, 57.0, 35.0, 39.0, 23.0, 11.0, 4.5;
     -10.0, -10.0, -2.0, 10.0, 17.0, 22.0, 23.0, 21.0, 15.0, 8.5, 0, -8.5,...
     -11.0, -7.0, 0, 10.0, 18.0, 21.5, 22.0, 19.0, 13.0, 6.0, 1.0, -2.0;
     1.2, 2.0, 2.5, 5.0, 9.0, 10.0, 8.0, 6.0, 5.0, 5.0, 6.2, 4.5,...
     2.0, 2.5, 3.0, 7.0, 10.0, 11.0, 5.5, 5.0, 5.0, 3.0, 2.0, 1.0;
     1.0, 1.0, 6.0, 30.0, 18.0, 13.0, 29.0, 74.0, 21.0, 15.0, 14.0, 11.0,...
     1.0, 2.0, 4.0, 0, 19.0, 81.0, 186.0, 114.0, 60.0, 35.0, 4.0, 6.0;
     1.2, 0.8, 2.4, 4.4, 6.3, 6.6, 5.6, 4.6, 2.3, 3.5, 2.4, 0.8,...
     1.3, 1.3, 4.1, 3.2, 6.5, 7.7, 5.5, 4.6, 3.6, 2.6, 1.7, 1.0
    ];

y = [6.92, 6.97, 6.84, 6.5, 5.75, 5.54, 5.63, 5.62, 5.96, 6.3, 6.8, 6.9,...
    6.7, 6.77, 6.67, 6.33, 5.82, 5.58, 5.48, 5.38, 5.51, 5.84, 6.32, 6.56];

3.2 划分训练数据与测试数据

使用第6号至第24号样本训练得出模型,再对第1号至第5号样本进行检验:

% 训练输入向量
trainx = x(:, 6:24);
% 训练样本对应的输出
trainy = y(6:24);

% 测试输入向量
testx = x(:,1:5);
% 测试样本对应的输出
testy = y(1:5);

3.3 数据增强

为充分利用训练样本,对19份训练样本进行二维插值,将样本数量增加到100份:

% 训练样本的个数
N = size(trainx, 2);
X = [trainx; trainy];

% 网格
[xx0, yy0] = meshgrid(1:N, 1:6);
[xx1,yy1] = meshgrid(linspace(1,N,100), 1:6);

% 使用interp2函数做二维三次插值
XX = interp2(xx0, yy0, X, xx1, yy1, 'cubic');

% 形状复原
trainx = XX(1:5, :);
trainy = XX(6, :);

3.4 创建径向基神经网络

使用newrb函数创建径向基神经网络。径向基网络需要若干参数,在这里设置误差容限为1e-8,扩散因子为22,最大神经元个数为101:

% 误差容限
er = 1e-8;

% 扩散因子
spread = 22;

% 神经元个数
N = 101;
net = newrb(trainx, trainy, er, spread, N);

3.5 测试

使用创建完成的径向基网络模型对第1-5份样本进行测试:

yy = net(testx);

四、结果展示

真实值与测试值对比如下:
在这里插入图片描述

五、完整代码

完整代码如下:

% rbf_underwater.m
%% 清理工作空间
clear,clc
close all

%% 定义输入数据
% 输入
x = [ 1.5, 1.8, 4.0, 13.0, 5.0, 9.0, 10.0, 9.0, 7.0, 9.5, 5.5, 12.0,...
    1.5, 3.0, 7.0, 19.0, 4.5, 8.0, 57.0, 35.0, 39.0, 23.0, 11.0, 4.5;
     -10.0, -10.0, -2.0, 10.0, 17.0, 22.0, 23.0, 21.0, 15.0, 8.5, 0, -8.5,...
     -11.0, -7.0, 0, 10.0, 18.0, 21.5, 22.0, 19.0, 13.0, 6.0, 1.0, -2.0;
     1.2, 2.0, 2.5, 5.0, 9.0, 10.0, 8.0, 6.0, 5.0, 5.0, 6.2, 4.5,...
     2.0, 2.5, 3.0, 7.0, 10.0, 11.0, 5.5, 5.0, 5.0, 3.0, 2.0, 1.0;
     1.0, 1.0, 6.0, 30.0, 18.0, 13.0, 29.0, 74.0, 21.0, 15.0, 14.0, 11.0,...
     1.0, 2.0, 4.0, 0, 19.0, 81.0, 186.0, 114.0, 60.0, 35.0, 4.0, 6.0;
     1.2, 0.8, 2.4, 4.4, 6.3, 6.6, 5.6, 4.6, 2.3, 3.5, 2.4, 0.8,...
     1.3, 1.3, 4.1, 3.2, 6.5, 7.7, 5.5, 4.6, 3.6, 2.6, 1.7, 1.0
    ];

y = [6.92, 6.97, 6.84, 6.5, 5.75, 5.54, 5.63, 5.62, 5.96, 6.3, 6.8, 6.9,...
    6.7, 6.77, 6.67, 6.33, 5.82, 5.58, 5.48, 5.38, 5.51, 5.84, 6.32, 6.56];

%% 划分训练数据与测试数据

% 训练输入向量
trainx = x(:, 6:24);
% 训练样本对应的输出
trainy = y(6:24);

% 测试输入向量
testx = x(:,1:5);
% 测试样本对应的输出
testy = y(1:5);

%% 对训练样本做插值

% 训练样本的个数
N = size(trainx, 2);
X = [trainx; trainy];

% 网格
[xx0, yy0] = meshgrid(1:N, 1:6);
[xx1,yy1] = meshgrid(linspace(1,N,100), 1:6);

% 使用interp2函数做二维三次插值
XX = interp2(xx0, yy0, X, xx1, yy1, 'cubic');

% 形状复原
trainx = XX(1:5, :);
trainy = XX(6, :);

%% 创建网络
% 误差容限
er = 1e-8;

% 扩散因子
spread = 22;

% 神经元个数
N = 101;
net = newrb(trainx, trainy, er, spread, N);

%% 测试 
yy = net(testx);

%% 计算、显示相对误差
e = (testy - yy)./testy;
fprintf('相对误差: \n ');
fprintf('%f   ', e);
fprintf('\n\n');
% 平均相对误差
m = mean( abs(e) );
fprintf('平均相对误差: \n %f\n', m);

% 最大相对误差
ma = max(abs(e));
fprintf('最大相对误差: \n %f\n', ma);

% 显示实际值与拟合值
figure(1)
plot(1:5, testy, 'bo-')
hold on
plot(1:5, yy, 'r*-')
title('地下水测试结果')
legend('真实值', '预测值')
axis([1,5,0,8])

% 显示残差
figure(2)
plot(1:5, abs(testy - yy), '-o')
title('残差')
axis([1,5,0,0.3])

ok,以上便是本文的全部内容了,制作不易,如果对你有所帮助,记得点个赞哟~

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

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

相关文章

C++刨析(this指针,构造,析构函数)

目录 this指针 构造函数 析构函数 this指针 在我们创建一个对象,对象去调用类中的函数的时候,有没有想过它是怎么进行修改的,回想我们以前写C语言的时候,如果我们写了一个栈,当需要操作栈中的数据时,我们需要把构造出来栈的变量的地址传过去,让函数拿到这个地址来对我们的栈…

通过Mars3d在地图上加载风力发电机车模型

首先理清需求,通过Mars3d的基础项目,在基础项目模板上添加一个风力发电机模型。 Mars3d官网的基础项目下载地址:Mars3D三维可视化平台 | 火星科技 gitee地址: git clone https://gitee.com/marsgis/mars3d-vue-project.git 下载…

【Linux】7、一篇文章学习 Linux 中一些硬核的常用知识

目录 一、systemctl二、软链接三、日期(date 命令)四、Linux 的时区(1) 修改时区(2) ntp 五、IP 地址六、主机名七、域名解析八、配置 Linux 的固定 IP 地址(1) 在 VMwareWorkstation 中配置 IP 地址网关和网段(IP 地址的范围)(2)…

深入理解计算机系统2--理解计算机系统的基本组成以及程序的运行

深入理解计算机系统2–理解计算机系统的基本组成以及程序的运行 前言 前面一章简单记录了程序在计算机系统是以什么形式被存储的以及编译器编译的过程,这篇文章则会记录程序是如何被运行的,它在磁盘中是如何被读取,计算机系统将会通过那些器…

BPF技术整理笔记

目录 eBPF是什么? eBPF是做什么的?可以解决什么问题? eBPF可以带来的解决方案是什么? eBPF的技术点 eBPF hookeBPF MapeBPF Helper FunctioneBPF有什么限制吗? 前言 21年因为项目需求而要开发一个工具,可以…

Bitmap引起的OOM问题

作者:向阳逐梦 1.什么是OOM?为什么会引起OOM? 答:Out Of Memory(内存溢出),我们都知道Android系统会为每个APP分配一个独立的工作空间,或者说分配一个单独的Dalvik虚拟机,这样每个APP都可以独立…

你的 Redis为什么变慢了?一文讲透Redis性能优化如何做

一、Redis为什么变慢了 1.Redis真的变慢了吗? 对 Redis 进行基准性能测试 例如,我的机器配置比较低,当延迟为 2ms 时,我就认为 Redis 变慢了,但是如果你的硬件配置比较高,那么在你的运行环境下&#xff…

哈夫曼树【北邮机试】

一、哈夫曼树 机试考察的最多的就是WPL,是围绕其变式展开考察。 哈夫曼树的构建是不断选取集合中最小的两个根节点进行合并,而且在合并过程中排序也会发生变化,因此最好使用优先队列来维护单调性,方便排序和合并。 核心代码如下…

2023有哪些适合学生的蓝牙耳机?盘点四款适合学生的无线蓝牙耳机

随着时代的发展,人们更青睐于能够提升生活品质的产品。蓝牙耳机因为摆脱了线的束缚,使用体验会更好。接下来,我来给大家推荐几款适合学生用的无线蓝牙耳机,有需要的朋友可以当个参考。 一、南卡小音舱Lite2蓝牙耳机 参考价&…

探索未来的数字人生:全景VR数字人

在数字化时代,人工智能和虚拟现实技术正日益成为我们生活中不可或缺的一部分。而全景VR数字人,则是这一时代的最新产品,吸引了越来越多的关注和研究。 一、什么是全景VR数字人? 全景VR数字人是一种通过虚拟现实技术创造的数字人形…

学术ChatGPT——利用ChatGPT助力日常工作与学习

ChatGPT的出现给各个行业带来了前所未有的冲击,其中也包括学术研究领域。在学术研究领域,有着「数学天才」之称陶哲轩之前就曾表示,他已经将ChatGPT纳入了自己的工作流程。 那么做为一名普通的工作或者学习的人员,如何使用ChatGPT…

[mars3d 学习] 最近升级版本造成的问题

1、mars3d升级3.5以上,使用的时候报错; 需要看下 Mars3D三维可视化平台 | 火星科技 版本更新日志; 使用将Cesium的版本升级到1.103 2、升级Cesium到1.103,之后打包又会报错 - error in ./node_modules/mars3d-Cesium/Build/Cesi…

用手机APP操作使用井用采样器更省时省力

井用采样器的主要功能特点就是:机身小巧,方便操作。可用于井下作业,手机APP可实时查看采样数据,节省人力。 利用自动采样器进行水样采集可以说节省很大的人力物力,但是有时为了采到更具代表性的水样,我们需…

如何选择多参数水质分析仪?

如何选择适合的多参数水质分析仪? 首先水质检测仪分为实验室(台式)和户外使用的便携式多参数水质检测仪。我们呢就要了解自己的需 求使用在什么领域,根据使用领域选择仪器;其次就是选择需要测定的指标,最好…

JAVA-6-[Spring框架]Bean的作用域和生命周期

1 Spring Bean 1、Spring有两种类型bean,一种普通bean,另外一种工厂bean(FactoryBean)。 2、普通bean:在配置文件中定义的bean类型就是返回的类型。 3、工厂bean:在配置文件中定义的bean类型可以和返回类型不一样。 第一步 创建类…

Streamlit 使用介绍

Streamlit 使用介绍 安装和运行参考资料 公共组件页面设置显示代码并运行st.help 查询帮助文档多页渲染 对象渲染直接渲染对象文本渲染st.markdown代码渲染公式渲染 展示图表显示表格趋势小卡片 显示图表显示媒体画迷宫显示本地图片播放视频/音频 显示状态彩蛋-放气球进度条 互…

KVM虚拟机的定时逐次开机设定方法-systemd方式

前言:KVM虚拟机系统是榨取服务器最大性能的一种好方法,但是谁也不想让服务器启动的时候要等待5分钟甚至以上的时间。 为了减轻服务器开机时的任务数量,需要虚拟机在开机后一段时间内,按顺序逐次启动,以达到各个服务间的…

A Time Series is Worth 64 Words(PatchTST模型)代码解析

前言 A Time Series is Worth 64 Words论文下载地址,Github项目地址,论文解读系列本文针对PatchTST模型参数与模型架构开源代码进行讲解,本人水平有限,若出现解读错误,欢迎指出开源代码中分别实现了监督学习(PatchTST…

千万级直播系统后端架构设计

1、架构方面 1.1 基本 该图是某大型在线演唱会的直播媒体架构简图。 可以看出一场大型活动直播涵盖的技术方案点非常庞杂,本节接下来的内容我们将以推拉流链路、全局智能调度、流量精准调度以及单元化部署,对这套直播方案做一个展开介绍。 1.2 推拉流链…

2023年大厂裁员严重,软件测试行业真的饱和了吗?

这短时间以来后台有很多小伙伴说找工作难,并且说软件测试行业饱和了?竟然登上了热榜 那么我今天带大家看看真实的市场行情,往下看 这个是公司联合某厂的HR招聘真实情况,很明显【软件测试】投简历竟然高达9999沟通才1千多&#xf…