bp神经网络对csv文件或者xlsx文件进行数据预测

1.input(1:m,:)‘含义

矩阵A第一列的转置矩阵。(x,y)表示二维矩阵第x行第y列位置的元素,x为:则表示所有的行。因此,A(:,1)就表示A的第1列的所有元素,这是一个列向量。

所以这里input(1:m,:)表示1到m行,所有列,而后面有个'这代表转置,综合来看就是将一个1到m行,所有列的矩阵进行转置。

2.如何在workspace中导入数据

首先点击左上角的import data

选择要导入的文件即可,之后会弹出新的界面,界面如下:

这里用到的地方就是range(范围)以及matrix(矩阵),range选择自己想要的的行与列即可。

之后点击对勾就可以导入到workspace里面。

3.newff函数

参考文章:

Matlab中newff函数使用方法和搭建BP神经网络的方法-CSDN博客

net = newff(data,label,[8,8],{'tansig','purelin'},'trainlm')


data:训练时网络的输入数据。newff函数会把data的一列当作一个样本,如果你的数据集是一行当作一个样本,记得将你的输入数据矩阵转置data.‘
label:对应输入数据的标签,也可以看作真实输出。同上,newff函数会把label的一列当作一个样本的标签,如果你的数据集是一行当作一个样本,记得将你的输入数据矩阵转置label.‘
[8,8]:用于确定神经网络隐藏层的层数以及每层的神经单元个数。[8,8]就表示该网络包含两个隐藏层,每个隐藏层有8个神经单元
{‘tansig’,‘purelin’}:表示个隐藏层所用的激活函数。{‘tansig’,‘purelin’}表示第一层用tansig激活函数,是一种S型激活函数;第二次用purelin激活函数,是一种线性型激活函数。常见的激活函数如下:

 logsig:对数S型函数tansig:正切S型函数purelin:线性型函数

‘trainlm’:确定训练函数,默认为trainlm函数,该方法需要占用更大的存储空间,使用了Levenberg-Marquardt算法,对于中等规模的BP神经网络有最快的收敛速度。由于其避免了直接计算赫赛矩阵,从而减少了训练中的计算量,但需要较大内存量,随着神经元的增多,训练时间增加较大。常见的训练方法如下:
 

 traingd:梯度下降算法traingdm:带动量的梯度下降算法traingda:学习率变化的梯度下降算法traingdx:学习率变化带动量的梯度下降算法trainrp:RPROP算法,内存需求小,适用于大型网络trainoss:OneStep Secant Algorithm,计算量与内存需求较小,适用于大型网络

(2)其他参数设置:
net.trainParam.goal = 1e-3 :确定目标值为0.001,到此值时训练停止
net.trainFcn=‘trainlm’ :确定训练函数trainlm。如果newff()中设置了,后续可以用不设置
net.trainParam.lr = 0.1 : 确定学习率为0.1
net.divideFcn = ‘’ :取消newff()默认再次划分操作。newff()默认将训练集重新划分6:2:2,训练集:测试集:验证集,在训练过程中会自动在某一处停止,我认为是为了防止过拟合吧,实践中在新训练集损失和新验证集损失下降不明显,且验证损失有上升的趋势时停止。对于数据本来就少的情况,建议取消划分。
net.trainParam.epochs = 1000 :训练最大迭代次数
net.trainParam.min_grad =1e-24 : 最小梯度值,到此值时训练停止
4.net.iw与net.b的含义

MATLAB中多层网络的net.lw{i,j}和net.b{k}的含义 - 知乎 (zhihu.com)

先假设神经网络结构,{ 9 [80 50 20] 1 };9为输入层,[80 50 20]为隐层,1为输出层。

  1. net.iw{1,1} 表示 输入层 到 第1层隐层 的权重,为80*9的矩阵;
  2. net.lw{2,1} 表示 第1层隐层 到 第2层隐层 的权重,为50*80的矩阵;
  3. net.lw{3,2} 表示 第2层隐层 到 第3层隐层 的权重,为20*50的矩阵;
  4. net.lw{4,3} 表示 第3层隐层 到 输出层 的权重,为1*20的矩阵;
  5. net.b{1} 表示 第1层隐层 的偏置,为80*1的矩阵;
  6. net.b{2} 表示 第2层隐层 的偏置,为50*1的矩阵;
  7. net.b{3} 表示 第3层隐层 的偏置,为20*1的矩阵;
  8. net.b{4} 表示 输出层 的偏置,为1*1的矩阵;

可以以此类推。

所以net.iw{1,1},模式也是固定的,仅表示输入层到第1层隐层的权重,之后就net.lw的事情了。net.lw{i,j} 表示 第j层隐层 到 第i层隐层 的权重。net.b{k} 表示 第k层隐层 的偏置或者说阈值,结构都为列向量。可以看出,这里假设的隐含层只有3层[80 50 20],但net中将最后一层输出层也当隐含层用了,所以 和 可以取到4。

知道权重和偏置的位置,可以用算法优化,如遗传算法等。

5.validation checks功能

matlab神经网络使用说明及validation check的作用_matlab中的validation-CSDN博客

当创建神经网络进行训练时,原始数据被自动分成training set、validation set 及test set 三部分。

training set:训练样本数据
validation set:验证样本数据
test set:测试样本数据

这三个数据集是没有重叠的,默认比例为7:1.5:1.5

可以通过设置改变比例分配:

net.divideParam.trainRatio = 80/100;
net.divideParam.valRatio = 0/100;
net.divideParam.testRatio = 20/100;

Neural Network

该部分展示了神经网络的结构,从结构图中可以看出该网络有三个隐含层,神经元个数分别为9个、8个、7个

Progress
Epoch:该网络允许的迭代次数最大为1000,实际迭代5次

Time:该网络训练时长为3秒

Performance:该网络的最大误差为0.475,目标误差为0.001,实际误差为0.000520,可在Plots中的Performance中详细查看

Gradient:该网络的最大梯度为1.91,阈值梯度为1 * e -7 ,实际梯度为0.033。可在Plots中的Training State中详细查看

Mu:该网络所使用Levenberg–Marquardt算法中的阻尼因子最小值为0.001,阈值为1* e 10 ,实际值为1* e -6 ,Mu值越大意味着算法收敛效果越好。可在Plots中的Training State中详细查看

Validation Checks:该网络的泛化能力检查标准,实际值为0表示在训练过程中误差在持续降低,若连续6次训练误差无法降低,则结束训练任务。可在Plots中的Training State中详细查看

Plots
Performance:该网络训练过程中的误差变换可视化

Training State:该网络训练过程中的梯度、Mu因子和泛化能力变换等信息的可视化

Regression:该网络训练集、验证集、测试集的回归能力可视化

Plot Interval:图中横坐标的刻度

matlab神经网络中的validation check
验证样本的检查值默认是6,是指在网络利用训练样本进行训练的过程中,验证样本的误差连续6次迭代不再下降,则训练终止(这只是训练终止条件之一,其他的如训练步数,目标误差等,满足任一条件,训练过程都将终止)。

我们可以这样理解,如果随着网络的训练,验证样本的误差已经基本不再减小,甚至增大,那么就没有必要再去训练网络了。因为即使继续训练下去,当我们利用测试样本进行网络测试时,测试样本的误差同样也不会有所改善,甚至会过度拟合。validation checks已经达到设置的值了,所以网络停止训练,即如果网络在连续max_fail epochs后不能提高网络性能,就停止训练。

通常,有三种方法解决这个问题:

提高validation checks的数值,比如设置net.trainParam.max_fail = 200,其实,这就是自己糊弄自己,非常不严谨,严重不推荐。训练时候,出现停止这种情况,就是因为被训练的网络出现了问题,已经过拟合,应该停下来。但6,的确,可能,有点小,建议改为10到20之间的数吧?这个需要细细思量一下,一般情况默认就好吧?

修改被训练的网络,比如说再加一个隐藏层试试

如果是数据太相近的问题,试试选择用输入训练数据的乱序排法,以及分类

我们要明白它为什么要停止。连续6次误差不断增大,说明网络性能越训练越差。这可能是两方面原因:

过拟合。网络学习得太好了,反而泛化能力下降。

网络规模不够大,信息存储能力不够强,原先学习的知识又被新样本抹去了,导致网络性能无法提升。

要解决这个问题:

如果要改变validation的验证次数,可以用这个语句net.trainParam.max_fail = 20;

或者是增多隐节点或隐层数。

另外,提前停止的网络虽然陷入局优,但不一定就不能用吧,看一下实际效果;

一般来说,不下降就是增大,不可能误差不变。数据少就降低隐层节点数。

取消validation check

加入如下参数,可以取消validation check功能

net.divideFcn =''

但是这个方法对于网络的训练精度提高和输出的逼近程度没有显著改善

matlab神经网络训练过程
在训练时,用training训练,每训练一次,系统自动会将validation set中的样本数据输入神经网络进行验证,在validation set输入后会得出一个误差(不是网络的训练误差,而是验证样本数据输入后得到的输出误差,可能是均方误差),而此前对validation set会设置一个步数,比如默认是6echo,则系统判断这个误差是否在连续6次检验后不下降,如果不下降或者甚至上升,说明training set训练的误差已经不再减小,没有更好的效果了,这时再训练就没必要了,就停止训练,不然可能陷入过学习。所以validation set有个设置步数,就是起这个作用。
复现代码如下:

close all
clc
%读取数据
input=X;
output=Y;
%设置训练数据与测试数据
input_train=input(1:8000,:)';
output_train=output(1:8000,:)';
input_test=input(8001:10000,:)';
output_test=output(8001:10000,:)';
%节点个数
inputnum=26;%输入层节点数量
hiddennum=12;%隐藏层节点数量
outputnum=1;%输出层节点数量
%训练数据归一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
%bp神经网络
net=newff(inputn,outputn,hiddennum,{'tansig','purelin'},'trainlm');
W1=net.iw{1,1};
B1=net.b{1};
W2=net.lw{2,1};
B2=net.b{2};
%网络参数配置
net.trainParam.epochs=30;
net.trainParam.lr=0.001;
net.trainParam.goal=0.0001;
%网络训练
net=train(net,inputn,outputn);
%测试样本归一化
inputn_test=mapminmax('apply',input_test,inputps);
%神经网络预测
an=sim(net,inputn_test);
%预测结果反归一化与预测值误差计算
test_simu=mapminmax('reverse',an,outputps);
error=test_simu-output_test;
%%第十步 真实值与预测值误差比较plot(output_test,'bo-')
hold on
plot(test_simu,'r*-')
hold on
plot(error,'square','MarkerFaceColor','b')
legend('期望值','预测值','误差')
xlabel('数据组数')
ylabel('样本值')
title('BP神经网络测试集的预测值与实际值对比图')[c,l]=size(output_test);
MAE1=sum(abs(error))/l;
MSE1=error*error'/l;
RMSE1=MSE1^(1/2);disp(['隐含层节点数为',num2str(hiddennum),'时的误差结果如下:'])
disp(['平均绝对误差MAE为:',num2str(MAE1)])
disp(['均方误差MSE为:       ',num2str(MSE1)])
disp(['均方根误差RMSE为:  ',num2str(RMSE1)])
predict_y = zeros(10000,1); % 初始化predict_y
pre_test=mapminmax('apply',new_X(:,:)',inputps);% 对预测数据进行归一化
for i = 1: 10000result = sim(net, pre_test(:,i));predict_y(i) = result;
end
disp('预测值为:')
predict_y=mapminmax('reverse',predict_y,outputps); %把预测结果还原
disp(predict_y)

目前训练过程中有问题,总是训练不完迭代次数就结束。

效果如下:

上面是预测结果;

5.解决方法

(1)通过增加隐藏层数,可以看到训练能够训练完,但是平均绝对误差并没有多大变化。但是我发现得出的结果预测值精度变高了,这与增加了一层有关。

下面是数据分析:

(2)再增加一层隐藏层

又增加一层之后发现预测值精度更高了,出现了0值得情况!说明增加网络深度对预测结果有很大帮助。

(3)再增加一层看看结果

可以看到增加到四层得出的预测值精度反而下降了,而且训练也没又迭代完。

(4)增加到第五层试一下

随着层数的增加,训练时间增加,预测值的精度并没有变高,也没有训练完。

综上最佳层数是三层。之后通过改变隐藏层节点数来确定是否能提高其精度以及训练迭代完成。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

玩转 Scrapy 框架 (一):Scrapy 框架介绍及使用入门

目录 一、Scrapy 框架介绍二、Scrapy 入门 一、Scrapy 框架介绍 简介: Scrapy 是一个基于 Python 开发的爬虫框架,可以说它是当前 Python 爬虫生态中最流行的爬虫框架,该框架提供了非常多爬虫的相关组件,架构清晰,可扩…

轮滑加盟培训机构管理系统源码开发方案

一、项目背景与目标 (一)项目背景 随着轮滑运动的普及和市场需求的增加,轮滑加盟培训机构逐渐兴起。这些机构面临着学员管理、课程排班、教师管理等多方面的挑战。为了提高管理效率和服务质量,需要开发一套专门针对轮滑加盟培训…

Java经典面试题:冒泡算法的使用

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍Java经典面试题:冒泡算法的使用以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录获,友友们有任何问题…

Jenkins 执行远程脚本的插件—SSH2 Easy

SSH2 Easy 是什么? SSH2 Easy 是一个 Jenkins 插件,它用于在 Jenkins 构建过程中通过 SSH2 协议与远程服务器进行交互。通过该插件,用户可以在 Jenkins 的构建过程中执行远程命令、上传或下载文件、管理远程服务器等操作。 以下是 SSH2 Eas…

程序员的20大Git面试问题及答案

文章目录 1.什么是Git?2.Git 工作流程3.在 Git 中提交的命令是什么?4.什么是 Git 中的“裸存储库”?5.Git 是用什么语言编写的?6.在Git中,你如何还原已经 push 并公开的提交?7.git pull 和 git fetch 有什么…

循环栅栏:CyclicBarrier

CyclicBarrier可以理解为循环栅栏,栅栏就是一种障碍物, 比如通常在私人宅院的周围就可以围上一圈栅栏,阻止闲杂人等入内。 这里当然就是用来阻止线程继续执行,要求线程在栅栏外等待。 前面的Cyclic意为循环,也就是说这…

模拟信号和数字信号的区别

模拟和数字信号是携带信息的信号类型。两种信号之间的主要区别在于模拟信号具有连续电信号,而数字信号具有非连续电信号。 模拟信号和数字信号之间的差异可以通过不同类型波的例子来观察。 什么是模拟信号(Analog Signals)? 许多系统使用模拟信号来传输…

Java中四种引用类型(强、软、弱、虚)

目录 引言 强引用(Strong References) 软引用(Soft References) 弱引用(Weak References) 虚引用(Phantom References) 引用类型的应用场景 总结 引言 Java中的引用类型是管理…

LVS负载均衡集群之HA高可用模式

Keepalived工具介绍 专为LVS和HA设计的一款健康检查工具 一个合格的集群应该具备的特性: 1.负载均衡 LVS Nginx HAProxy F5 2.健康检查(探针) for调度器/节点服务器 Keeplived Hearbeat 3.故障转移 通过VIP飘逸实现主备切换 健康检查&am…

Python数据加密:保障信息安全的最佳实践

更多资料获取 📚 个人网站:ipengtao.com 随着信息技术的发展,数据安全成为越来越重要的议题。在Python中,有多种方法可以用于数据加密,以确保敏感信息在传输和存储过程中不被泄露或篡改。本文将详细介绍Python中数据加…

数据可视化---直方图

内容导航 类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统…

基于SpringBoot+Vue的小区物业管理系统

基于SpringBootVue的小区物业管理系统的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringBootVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 主页 房屋类型 论坛 登录界面 管理员界面 员工界面 摘要 小区物业管理系统是一个…