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: 10000
    result = 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)增加到第五层试一下

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Win32程序与MFC程序构建顺序梳理

Windows程序的生成顺序 Windows窗口的生命周期 初始化操作 从WinMain函数开始,注册窗口;创建窗口; 调用CreateWindow,为程序建立了一个窗口,作为程序的屏幕 舞台。CreateWindow产生窗口之后会送出WM_CREATE消息给窗口函数&…

人工智能中的核心概念

1 概述 人工智能英文缩写为AI,是一种由人制造出来的机器,该机器可以模仿人的思想和行为,从而体现出一种智能的反应。 人工智能的产业链分为基础层、技术层、应用层三个层次。 基础层包括:芯片、大数据、算法系统、网络等多项基础…

企业呼叫中心系统怎么样?

随着现代商业环境的变化,呼叫中心系统成为众多企业日常运营的重要组成部分。企业呼叫中心系统是一种集中管理和处理企业电话通信的解决方案,它可以改善客户服务质量,提升服务效率,并为企业带来诸多优势。 企业呼叫中心系统功能概…

2021年数维杯国际大学生数学建模D题2021年电影市场票房波动模型分析求解全过程文档及程序

2021年数维杯国际大学生数学建模 D题 2021年电影市场票房波动模型分析 原题再现: 1、电影票房预测建模背景   随着人们文化消费需求的增加,电影院和银幕的数量不断增加,我国的电影产业不断呈现出繁荣景象。2019年,全国电影票房…

2024年【金属非金属矿山(地下矿山)安全管理人员】及金属非金属矿山(地下矿山)安全管理人员实操考试视频

题库来源:安全生产模拟考试一点通公众号小程序 金属非金属矿山(地下矿山)安全管理人员是安全生产模拟考试一点通总题库中生成的一套金属非金属矿山(地下矿山)安全管理人员实操考试视频,安全生产模拟考试一…

libxls - 编译

文章目录 libxls - 编译概述笔记静态库工程测试控制台exe工程测试备注备注END libxls - 编译 概述 想处理.xls格式的excel文件. 查了一下libxls库可以干这个事. 库地址 https://github.com/libxls/libxls.git 但是这个库的makefile写的有问题, 在mingw和WSL下都编译不了. 好在…

1265. 数星星(树状数组/蓝桥杯)

题目&#xff1a; 输入样例&#xff1a; 5 1 1 5 1 7 1 3 3 5 5输出样例&#xff1a; 1 2 1 1 0 思路&#xff1a; 树状数组 代码&#xff1a; #include<cstdio> #include<iostream> using namespace std; const int N32010; int n; int tr[N],level[N];int lo…

Linux---用户组相关操作

1. 创建用户组 命令说明groupadd创建(添加)用户组 创建用户组效果图: 2. 创建用户并指定用户组 创建用户并指定用户组效果图: 3. 修改用户组 修改用户组效果图: 4. 删除用户组 命令说明groupdel删除用户组 删除用户组效果图: 说明: 如果用户组下面有用户先删除用户在…

回归预测 | MATLAB实现IBL-LSSVM【23年新算法】逻辑优化算法优化最小二乘支持向量机的数据回归预测 (多指标,多图)

回归预测 | MATLAB实现IBL-LSSVM【23年新算法】逻辑优化算法优化最小二乘支持向量机的数据回归预测 &#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现IBL-LSSVM【23年新算法】逻辑优化算法优化最小二乘支持向量机的数据回归预测 &#xff08;多指标…

【C++】封装:练习案例-点和圆的关系

练习案例&#xff1a;点和圆的关系 设计一个圆形类&#xff08;Circle&#xff09;&#xff0c;和一个点类&#xff08;Point&#xff09;&#xff0c;计算点和圆的关系。 思路&#xff1a; 1&#xff09;创建点类point.h和point.cpp 2&#xff09;创建圆类circle.h和circle…

什么是漏电保护芯片?具有什么作用?

漏电保护芯片是一种用于监测电气设备是否存在漏电并提供保护的微型芯片。漏电是电气设备中普遍存在的一种安全隐患,当设备发生漏电时,电流会流回地线,并可能导致电击、火灾等严重后果。因此,漏电保护芯片的使用对于保障人身财产安全具有非常重要的意义。下面就是我们几款漏电保…

格式化Echarts的X轴显示,设置显示间隔

业务需求&#xff1a;x轴间隔4个显示&#xff0c;并且末尾显示23时 x轴为写死的0时-23时&#xff0c;使用Array.from data: Array.from({ length: 24 }).map((_, i) > ${i}时) 需要在axisLabel 里使用 interval: 0, // 强制显示所有刻度标签&#xff0c;然后通过 formatter …

【Axure教程】区间评分条

区间评分条是一种图形化的表示工具&#xff0c;用于展示某一范围内的数值或分数&#xff0c;并将其划分成不同的区间。这种评分条通常用于直观地显示数据的分布或某个指标的表现。常用于产品评价、调查和反馈、学术评价、健康评估、绩效评估、满意度调查等场景。 所以今天作者…

大语言模型加速信创软件 IDE 技术革新

QCon 全球软件开发大会&#xff08;上海站&#xff09;将于 12 月 28-29 日举办&#xff0c;会议特别策划「智能化信创软件 IDE」专题&#xff0c;邀请到华为云开发工具和效率领域首席专家、华为软件开发生产线 CodeArts 首席技术总监王亚伟担任专题出品人&#xff0c;为专题质…

bottom-up-attention-vqa-master 成功复现!!!

代码地址 1、create_dictionary.py 建立词典和使用预训练的glove向量 &#xff08;1&#xff09;create_dictionary() 遍历每个question文件取出所关注的question部分&#xff0c;qs 遍历qs&#xff0c;对每个问题的文本内容进行分词&#xff0c;并将分词结果添加到字典中&…

解决飞书文档导出word后公式乱码/不可显示问题

目录 项目场景: 原因分析: 解决方案: 项目场景: 飞书文档导出为word: 但是公式会出现在word中无法显示、乱码等问题。 原因分析: 飞书做的有点菜

智能优化算法应用:基于静电放电算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于静电放电算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于静电放电算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.静电放电算法4.实验参数设定5.算法结果6.…

DS哈希查找—线性探测再散列

Description 定义哈希函数为H(key) key%11&#xff0c;输入表长&#xff08;大于、等于11&#xff09;。输入关键字集合&#xff0c;用线性探测再散列构建哈希表&#xff0c;并查找给定关键字。 –程序要求– 若使用C只能include一个头文件iostream&#xff1b;若使用C语言…

Java_Lambda表达式JDK8新特性(方法引用)

一、Lambda表达式 接下来&#xff0c;我们学习一个JDK8新增的一种语法形式&#xff0c;叫做Lambda表达式。作用&#xff1a;用于简化匿名内部类代码的书写。 1.1 Lambda表达式基本使用 怎么去简化呢&#xff1f;Lamdba是有特有的格式的&#xff0c;按照下面的格式来编写Lamd…

FPGA实现 TCP/IP 协议栈 客户端 纯VHDL代码编写 提供4套vivado工程源码和技术支持

目录 1、前言版本更新说明免责声明 2、相关方案推荐我这里已有的以太网方案1G 千兆网 TCP-->服务器 方案10G 万兆网 TCP-->服务器客户端 方案常规性能支持多节点FPGA资源占用少数据吞吐率高低延时性能 4、TCP/IP 协议栈代码详解代码架构用户接口代码模块级细讲顶层模块PA…