基于matlab实现的BP神经网络预测美国死亡人数

基于matlab实现的BP神经网络预测美国死亡人数


前言

这是研究生深度学习课程的第一次作业,过程比较曲折,仅此记录一下。


一、第一章 作业要求

用BP网络和RBF网络预测美国新冠疫情死亡人数数据。写出作业报告及调试心得体会,形成PDF文件交作业。一周时间。
要求:
1.用2021年2月1日-3月10日的死亡人数数据做训练集,3月11日-17日数据作为测试集
2.输入数据集收集:
2.1四输入一输出
2.2三维输入分别用前三天的死亡数据做输入,第四维输入用14天前的新增新冠感染人数数据
2.3输出一维,即当天死亡人数数据
2.4训练前,数据要预处理和归一化
3.BP网络结构采用三层网络,隐含层神经元个数从低到高采用试凑法,激活函数用S型函数或其他。
4.数据结果:
3.1 训练误差和训练代数变化图
3.2真实死亡曲线和BP网络输出图(红色和蓝色曲线),输出在一张图上做比较
3.3 天预测值和真实值的比较表个,7天每天的误差和求和的总误差值。总误差值最小者,得分最高。
3.4附原程序和作业说明报告,以及心得体会。

二、BP神经网络程序源码及训练结果

1.BP网络程序源码及注释

代码如下(示例):
clear
close ALL
clc
%定义全局变量
%为划分训练集和验证集使用 四维输入数据列数不同,方便输入数据以及划分
m=41;
%读取数据
input1=importdata(‘input1.txt’);%读取输入数据1
input2=importdata(‘input2.txt’);%读取输入数据2
input3=importdata(‘input3.txt’);%读取输入数据3
input4=importdata(‘input4.txt’);%读取输入数据4
output1=importdata(‘output.txt’);%读取输出数据
%数据归一化
%对四维输入以及一维输出单独进行归一化
[input1_guiyi,input1ps] = mapminmax(input1,0,1);
[input2_guiyi,input2ps] = mapminmax(input2,0,1);
[input3_guiyi,input3ps] = mapminmax(input3,0,1);
[input4_guiyi,input4ps] = mapminmax(input4,0,1);
[output,outputps] = mapminmax(output1,0,1);
%将四维输入合并为输入矩阵
input1_guiyi_all=input1_guiyi(:,1:m);%先对四维输入数据分别进行裁剪
input2_guiyi_all=input2_guiyi(:,1:m);
input3_guiyi_all=input3_guiyi(:,1:m);
input4_guiyi_all=input4_guiyi(:,1:m);
input = [input1_guiyi_all;input2_guiyi_all;input3_guiyi_all;input4_guiyi_all];%将四维输入合并为输入矩阵
%划分训练集数据
input_train=input(:,1:35);
output1_train=output1(:,1:35);%未进行归一化的输出 保留为计算误差使用
output_train=output(:,1:35);%归一化后的输出
%划分测试集数据
input_test=input(:,36:m);
output1_test=output1(:,36:m);%未进行归一化的输出 保留为计算误差使用
output_test=output(:,36:m);%归一化后的输出
%构建BP神经网络
% net=newff(input,output,5, { ‘logsig’ ‘tansig’ } ,‘traingd’);
net=newff(input,output,[3]);%[]内数据为神经元个数
%网络参数
net.trainParam.epochs=10000;%迭代次数
net.trainParam.lr=0.18;%学习速率设置
net.dividefcn=‘’;%不对训练数据随机划分验证集,与测试集
net.trainParam.goal=1e-20;%误差设置
%BP神经网络训练
net=train(net,input_train,output_train);
an=sim(net,input_train);%计算输出训练结果
test_simu=mapminmax(‘reverse’,an,outputps);%训练集预测结果反归一化
error=test_simu-output1_train;%计算计算值和真实值的误差
%BP神经网络预测
an1=sim(net,input_test);%使用训练好的模型计算验证集结果
test1_simu=mapminmax(‘reverse’,an1,outputps);%验证集计算结果反归一化
error1=test1_simu-output1_test;%计算计算值和实际值的误差
% 训练集真实值与预测值误差比较
figure(1)
n=(1:35);
plot(n,output1_train,‘bo-’,n,test_simu,‘r*-’)%画实际输出数据曲线
x = {‘2/4’ ‘2/5’ ‘2/6’ ‘2/7’ ‘2/8’ ‘2/9’ ‘2/10’ ‘2/11’ ‘2/12’ ‘2/13’ …
‘2/14’ ‘2/15’ ‘2/16’ ‘2/17’ ‘2/18’ ‘2/19’ ‘2/20’ ‘2/21’ ‘2/22’ …
‘2/23’ ‘2/24’ ‘2/25’ ‘2/26’ ‘2/27’ ‘2/28’ ‘3/1’ ‘3/2’ ‘3/3’ ‘3/4’…
‘3/5’ ‘3/6’ ‘3/7’ ‘3/8’ ‘3/9’ ‘3/10’}; % 时间轴刻度
hold on
plot(error,‘square’,‘MarkerFaceColor’,‘b’)%描画误差值
legend(‘实际值’,‘预测值’,‘误差’)
xlabel(‘日期’),ylabel(‘值’),title(‘训练集预测值和实际值的误差对比’),set(gca,‘fontsize’,12)
set(gca,‘XTickLabel’,[x])
%计算训练集误差
[~,len]=size(output);
MSE1=error*error’/len;%计算训练集均方误差
RMSE1=MSE1^(1/2);%计算训练集均方根误差
disp([‘-----------误差计算----------’]);
disp(['训练集均方误差MSE为: ',num2str(MSE1)]);
disp([‘训练集均方根误差RMSE为: ‘,num2str(RMSE1)]);
%输出测试集预测数据
disp([’-----------测试集预测数据----------’]);
disp([‘测试集验证日期: 3/11 3/12 3/13 3/14 3/15 3/16’]);
disp(['测试集预测数据为: ',int2str(test1_simu)]);%将数据整形为证书数据输出,舍弃小数部分
disp(['测试集实际数据为: ',int2str(output1_test)]);
disp(['测试集误差为: ',int2str(error1)]);

数据设置

输入数据存放在TXT文档中,横向排列,m 变量可根据输入天数改变,划分训练集与测试集。

部分实验结果

图片: 在这里插入图片描述
误差显示
在这里插入图片描述
预测结果及误差

总结

1.在进行数据归一化时,输入数据4为14日前美国新冠疫情新增感染人数,数量级比前三个数日数据量级大,应该单独进行归一化,不然会影响前三个输入数据在训练时的作用。
2.当学习率调至较低或隐藏层神经元太多时,会出现过拟合情况,即在训练集完全拟合,均方误差小于10e-10,在测试集内实验效果非常不好,误差会达到1000以上。经过多次试验,隐藏层神经元个数定为3个,学习率设为0.18,可以达到比较好的训练以及测试效果。

  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小呆瓜要润了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值