BP神经网络预测绿灯时长MatLab代码实现步骤

**

BP神经网络预测绿灯时长MatLab代码实现

**
1. BP神经网络的简介和结构参数
神经网络是机器学习中一种常见的数学模型,通过构建类似于大脑神经突触联接的结构,来进行信息处理。在应用神经网络的过程中,处理信息的单元一般分为三类:输入单元、输出单元和隐含单元。 顾名思义:输入单元接受外部给的信号与数据;输出单元实现系统处理结果的输出;隐含单元处在输入和输出单元之间,从网络系统外部是无法观测到隐含单元的结构的。除了上述三个处理信息的单元之外,神经元间的连接强度大小由权值等参数来决定。

1.1 BP神经网络的结构组成
下图是训练神经网络时经常出现的一个界面,从这部分我们可以看到,这是一个3输入1输出,5个隐含层的BP网络,称为3-5-1网络结构。(输入层参数为车流量,车速及人流量,输出层为绿灯时长)

2.实现BP网络的步骤
1.读取数据(我使用的是 xlsx文件格式的数据)
2.设置训练数据和预测数据
3.训练样本数据归一化
4.构建BP神经网络
5.网络参数配置(训练次数,学习速率,训练目标最小误差.等)
6.BP神经网络训练
7.测试样本归一化
8.BP神经网络预测
9.预测结果反归一化与误差计算
10.验证集的真实值与预测值误差比较

3.MatLab代码编写

%% 此程序为BP神经网络进行预测绿灯时长的Matlab代码
% “工作簿2”里的数据为大沙地路口的车流量,车速及人流量,网络为3输入,1输出
% 368组数据,其中338组为训练数据,30组为测试数
% 清空环境变量clear
close all
clc

%% 读取数据
data=xlsread('工作簿2.xlsx');

%输入输出
input=data(:,1:end-1);
output=data(:,end);

%% 设置训练数据和预测数据

m=338;         %设置训练样本个数 338

input_train = input(1:m,:)';
output_train = output(1:m,:)';
input_test = input(m+1:end,:)';
output_test = output(m+1:end,:)';

%节点个数
inputnum=size(input_train,1);   %size(X,1)返回的是矩阵X的行数
hiddennum=5;
outputnum=size(output_train,1);

%% 数据归一化
[inputn,inputps]=mapminmax(input_train);%归一化到[-1,1]之间,inputps用来作下一次同样的归一化,归一化的作用是消除每个样本数据的不同指标的数量级的影响
[outputn,outputps]=mapminmax(output_train);

%% 构建BP神经网络
net=newff(inputn,outputn,hiddennum,{'tansig','purelin'},'trainlm');% 建立模型,传递函数使用purelin,采用梯度下降法训练

W1= net. iw{1, 1};%输入层到中间层的权值
B1 = net.b{1};%中间各层神经元阈值

W2 = net.lw{2,1};%中间层到输出层的权值
B2 = net. b{2};%输出层各神经元阈值

%% 网络参数配置( 训练次数,学习速率,训练目标最小误差,显示频率,动量因子,最小性能梯度,最高失败次数)
net.trainParam.epochs=1000;         % 训练次数,这里设置为1000次
net.trainParam.lr=0.01;                   % 学习速率,这里设置为0.01
net.trainParam.goal=0.0001;                    % 训练目标最小误差,这里设置为0.00001
net.trainParam.show=25;                % 显示频率,这里设置为每训练25次显示一次
net.trainParam.mc=0.01;                 % 动量因子
net.trainParam.min_grad=1e-6;       % 最小性能梯度
net.trainParam.max_fail=6;               % 最高失败次数

%% BP神经网络训练
[net,tr]=train(net,inputn,outputn);%开始训练,其中inputn,outputn分别为输入输出样本
view(net)
figure(1),plotperform(tr)                          %误差MSE下降线

%% 训练结果
an0=sim(net,inputn); %用训练好的模型进行仿真
train_simu=mapminmax('reverse',an0,outputps);

%% 测试样本归一化
inputn_test=mapminmax('apply',input_test,inputps);% 对样本数据进行归一化

%% BP神经网络预测
an=sim(net,inputn_test); %用训练好的模型进行仿真

%% 预测结果反归一化与误差计算     
test_simu=mapminmax('reverse',an,outputps); %把仿真得到的数据还原为原始的数量级
error=test_simu-output_test;      %预测值和期望值的误差
errorPercent=abs(error)./output_test;   %计算相对误差 
[c,l]=size(output_test);            %%计算测试集样本总数l

% 决定系数R^2
R2 = (l* sum(test_simu .* output_test) - sum(test_simu) * sum(output_test))^2 / ((l * sum((test_simu).^2) - (sum(test_simu))^2) * (l * sum((output_test).^2) - (sum(output_test))^2)); 

%% 网络预测图形
%% 期望值与预测值误差比较
figure('name','测试集预测值与期望值的对比图')
plot(output_test,'ro-')
hold on
plot(test_simu,'b*-')
title('BP神经网络测试集预测值与期望值的对比','fontsize',12)
xlim([1 l])   %限制x轴范围
legend('期望值','预测值')
xlabel('测试样本')
ylabel('绿灯时长')

figure('name','误差图')
plot(error,'b*-')
title('BP神经网络预测值和期望值的误差图','fontsize',12)
xlim([1 l])   %限制x轴范围
xlabel('样本编号')
ylabel('误差')
%误差分析

MAE1=sum(abs(error))/l;
MSE1=error*error'/l;
RMSE1=MSE1^(1/2);
errorPmin=min(errorPercent);
errorPmax=max(errorPercent);
errorPav=sum(errorPercent)/l;
%输出结果
disp(['-----------------------误差计算--------------------------'])
disp(['平均绝对误差MAE为:',num2str(MAE1)])
disp(['均方误差MSE为:       ',num2str(MSE1)])
disp(['均方根误差RMSE为:  ',num2str(RMSE1)])
disp(['最小相对误差为:       ',num2str(errorPmin)])
disp(['最大相对误差为:        ',num2str(errorPmax)])
disp(['平均相对误差为:        ',num2str(errorPav)])
disp(['决定系数R方为:         ',num2str(R2)])





  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BaoSheng Tang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值