赞
踩
BP(Backpropagation)神经网络,也称为反向传播神经网络,是一种非常重要的人工神经网络。它基于梯度下降算法,通过反向传播误差来更新神经网络中的权重和偏差,以达到优化网络和提高预测准确性的目的。
BP神经网络主要包括以下几个步骤:
前向传播:在这个阶段,输入数据被送入网络,并通过每一层传播,直到输出层。每一层的输出都是下一层的输入。每个神经元的输出都是其权重加权输入的总和,再经过一个活化函数。
计算误差:在得到网络输出后,我们需要计算预测值与实际值之间的差异,这个差异被称为误差或损失。常用的误差计算方法有均方误差、交叉熵等。
反向传播:在这个阶段,误差会从输出层开始,反向传播至每一层,用于更新每一层的权重和偏差。误差的反向传播是通过链式法则(Chain Rule)来完成的。
权重更新:根据计算出的误差,我们可以按照梯度下降的方法来更新每个神经元的权重和偏差。通常,我们会设定一个学习率来控制更新的步长。
迭代训练:以上的步骤会在大量的数据上反复进行,直到网络的预测性能达到满意的水平,或者达到预设的迭代次数。
BP神经网络是一种强大的工具,可以应用于许多复杂的预测和分类任务。然而,它也有一些缺点,比如可能会陷入局部最优,或者在面对复杂的网络结构和大规模的数据时,训练过程可能会非常耗时。
数据:
时间 | 0分 | 15分 | 30分 | 45分 |
3月2日0时 | 3.530887 | 5.36667 | 4.949443 | 6.20111 |
3月2日1时 | 7.369333 | 4.615667 | 5.28322 | 3.614333 |
3月2日2时 | 3.447443 | 4.69911 | 4.615667 | 6.53489 |
3月2日3时 | 5.116333 | 5.45011 | 6.785223 | 6.618333 |
3月2日4时 | 7.119 | 8.787877 | 10.12301 | 10.03957 |
3月2日5时 | 10.62368 | 10.62367 | 8.120333 | 7.035553 |
3月2日6时 | 7.619667 | 8.704443 | 9.622357 | 11.4581 |
3月2日7时 | 10.28989 | 10.37333 | 10.95743 | 9.789233 |
3月2日8时 | 11.625 | 9.288557 | 8.704443 | 8.370667 |
3月2日9时 | 7.119 | 8.287223 | 7.953447 | 8.03689 |
3月2日10时 | 8.787887 | 7.703113 | 8.787887 | 11.12433 |
3月2日11时 | 11.45813 | 10.03954 | 8.871333 | 9.705767 |
3月2日12时 | 9.872643 | 8.537553 | 11.87533 | 11.70843 |
3月2日13时 | 10.54022 | 8.203777 | 8.954767 | 10.20644 |
3月2日14时 | 10.03957 | 10.20644 | 11.37466 | 10.2899 |
3月2日15时 | 9.9561 | 7.28589 | 6.451443 | 6.368 |
3月2日16时 | 6.701777 | 6.117667 | 5.95078 | 5.78389 |
3月2日17时 | 3.614333 | 4.031557 | 5.950777 | 5.700443 |
3月2日18时 | 4.281887 | 4.198447 | 5.867333 | 6.701777 |
3月2日19时 | 7.28589 | 7.28589 | 6.785223 | 6.618333 |
3月2日20时 | 6.70178 | 6.701777 | 7.786553 | 7.536223 |
3月2日21时 | 7.202447 | 5.28322 | 5.283223 | 7.118997 |
3月2日22时 | 8.954777 | 7.786557 | 7.786557 | 5.616997 |
3月2日23时 | 5.28322 | 5.45011 | 5.116333 | 5.28322 |
3月3日0时 | 6.368 | 4.865997 | 6.034223 | 4.615663 |
3月3日1时 | 4.53222 | 4.782553 | 3.280557 | 3.19711 |
3月3日2时 | 4.699113 | 5.283223 | 4.866 | 4.281887 |
3月3日3时 | 3.614333 | 3.113667 | 3.030223 | 2.779887 |
3月3日4时 | 2.696447 | 3.19711 | 7.369333 | 8.787877 |
3月3日5时 | 10.95743 | 7.28589 | 10.54021 | 10.28991 |
3月3日6时 | 9.37199 | 9.789233 | 12.29254 | 8.287213 |
3月3日7时 | 6.70178 | 6.95211 | 8.03689 | 7.28589 |
3月3日8时 | 8.621 | 6.785223 | 8.954767 | 8.120333 |
3月3日9时 | 9.53889 | 8.03689 | 10.95747 | 7.53622 |
3月3日10时 | 7.119 | 9.288553 | 10.79054 | 9.705777 |
3月3日11时 | 8.62099 | 11.70846 | 12.70977 | 12.62633 |
3月3日12时 | 12.45947 | 10.123 | 13.4608 | 13.3773 |
3月3日13时 | 11.12432 | 13.04353 | 12.87664 | 12.04223 |
3月3日14时 | 10.45678 | 12.12567 | 8.03689 | 10.28987 |
3月3日15时 | 12.37597 | 12.1257 | 7.953443 | 10.20643 |
3月3日16时 | 10.28989 | 8.704447 | 8.454113 | 8.28722 |
3月3日17时 | 10.79054 | 10.37333 | 10.20644 | 7.28589 |
3月3日18时 | 9.872667 | 8.120333 | 7.869997 | 7.953443 |
3月3日19时 | 8.537557 | 7.53622 | 7.452777 | 5.116333 |
3月3日20时 | 4.448777 | 5.950777 | 6.368003 | 5.533557 |
3月3日21时 | 2.946777 | 3.53089 | 3.447443 | 2.362663 |
3月3日22时 | 4.53222 | 4.782557 | 3.697777 | 4.69911 |
3月3日23时 | 4.699113 | 4.365333 | 4.949443 | 5.700443 |
3月4日0时 | 4.69911 | 5.45011 | 5.45011 | 4.115 |
3月4日1时 | 5.533553 | 4.365333 | 4.198443 | 5.78389 |
3月4日2时 | 4.44878 | 4.866 | 5.366667 | 3.69778 |
3月4日3时 | 4.115 | 5.03289 | 5.11633 | 3.69778 |
3月4日4时 | 3.614333 | 5.283223 | 5.617003 | 6.284557 |
3月4日5时 | 4.782553 | 3.697777 | 4.36533 | 4.865997 |
3月4日6时 | 4.69911 | 5.283223 | 5.366667 | 4.866 |
3月4日7时 | 4.115 | 3.447443 | 3.614333 | 2.696443 |
3月4日8时 | 2.36267 | 3.614337 | 3.03022 | 3.94811 |
3月4日9时 | 3.530887 | 3.030223 | 4.448777 | 4.281887 |
3月4日10时 | 4.198447 | 4.782557 | 2.199224 | 2.863333 |
3月4日11时 | 3.948113 | 4.031557 | 3.280553 | 2.696443 |
3月4日12时 | 3.447443 | 3.113663 | 4.53222 | 3.94811 |
3月4日13时 | 3.864667 | 2.863333 | 4.949443 | 3.41089 |
3月4日14时 | 5.950777 | 5.283223 | 4.115 | 5.116333 |
3月4日15时 | 4.53222 | 3.614333 | 4.365333 | 3.19711 |
3月4日16时 | 4.782553 | 5.116333 | 4.44878 | 6.201113 |
3月4日17时 | 8.120337 | 6.701777 | 6.367997 | 5.867333 |
3月4日18时 | 5.867337 | 5.617 | 5.28322 | 5.867333 |
3月4日19时 | 5.36667 | 5.366667 | 4.61567 | 4.615663 |
3月4日20时 | 5.19978 | 5.78389 | 4.949443 | 4.44878 |
3月4日21时 | 4.365333 | 3.197113 | 1.488222 | 2.279223 |
3月4日22时 | 2.112333 | 2.446113 | 2.362667 | 2.362667 |
3月4日23时 | 2.195777 | 2.44611 | 1.945447 | 0.950999 |
MATLAB代码:
%% BP神经网络 预测风速
clc;close all;clear all;%清除变量
%% 全部数据输入
%% 1训练
%% (1)读取数据和数据转换
filename1='风速数据.xls';
[data,~,c1]=xlsread(filename1);%读取数据
% 数据处理
dt=15/60;
t0=0;
datasep=reshape(data',1,numel(data));
long1=length(datasep);
datatime=zeros(1,long1);
for t=1:long1
datatime(1,t)=t0+(t-1)*dt;
end
datatime;
datasep;
%% 生成输入数据(7天预测第八天)
N=7;
inputdata=zeros(N,long1-N);
outputdata=zeros(1,long1-N);
times=zeros(1,long1-N);
for i=1:long1-N
a1=i;
a2=a1+N-1;
inputdata(1:N,i)=datasep(a1:a2);
outputdata(1,i)=datasep(a2+1);
times(1,i)=datatime(a2+1);%时间
end
Outputdata=outputdata;
Inputdata=inputdata;
index1=randperm(size(Outputdata,2));
index2=1:size(Outputdata,2);
numberTest=100;%用于测试的样本个数(数据集的最后numberTest个作为测试样本) ,可以修改!!
% 定义训练集
P1=Inputdata(:,index1(1:end-numberTest));
T1=Outputdata(:,index1(1:end-numberTest));
t1=times(:,index1(1:end-numberTest));
% 定义测试集(用最后10个样本做测试)
P2=Inputdata(:,index2(end-numberTest+1:end));
T2=Outputdata(:,index2(end-numberTest+1:end));
t2=times(:,index2(end-numberTest+1:end));
%设置训练集和测试集
%% (2)训练数据归一化
[~,inputps]=mapminmax(Inputdata);
[~,outputps]=mapminmax(Outputdata);
%测试数据归一化
input_train=mapminmax('apply',P1,inputps);
output_train=mapminmax('apply',T1,outputps);
input_test=mapminmax('apply',P2,inputps);
%% (3)BP的构建,训练和测试
%% 搜索最优隐含节点数
set1=6:2:16;
long2=length(set1);
BPa=zeros(long2,1);
for i=1:long2
hnumber=set1(i);
net=newff(input_train,output_train,hnumber);%新建BP神经网络net
% 设置神经网络的参数
net.divideFcn ='';
net.trainparam.epochs=1000;%训练次数
net.trainparam.goal=0.000000001;%精度
net.trainparam.lr=0.01;%学习率
[net,tr]=train(net,input_train,output_train);%训练
%% 2测试
testvalue=sim(net,input_test);
testvalue=mapminmax('reverse',testvalue,outputps);%预测数据反归一化
BPa(i,1)=sum((T2-testvalue).^2./T2);
end
[v1,indexbest]=min(BPa);
%% 绘制隐含节点数的影响
figure;
plot(set1,BPa,'bo--');
xlabel('隐含节点数');
ylabel('相对误差');
title('BP神经网络预测的相对误差与隐含节点数的关系');
hnumberbest=set1(indexbest);
net=newff(input_train,output_train,hnumberbest);%新建BP神经网络net
% 设置神经网络的参数
net.divideFcn ='';
net.trainparam.epochs=1000;%训练次数
net.trainparam.goal=0.000000001;%精度
net.trainparam.lr=0.01;%学习率
[net,tr]=train(net,input_train,output_train);%训练
%% 2测试
testvalue=sim(net,input_test);
testvalue=mapminmax('reverse',testvalue,outputps);%预测数据反归一化
%% (4)输出结果
mse01=tr.perf;
RMSETrain1=sqrt(mse01(end));
testvalue1=testvalue;
t2=t2/24;
figure;
plot(T2,'b-');
hold on;
plot(testvalue1,'r--');
legend('实际值','BP神经网络预测值');
% set(gca,'xtick',t2);
for i=1:length(t2)
tm{1,i}=datestr(t2(i),'HH:MM');
end
set(gca,'xticklabel',tm);
xlabel('时间');
ylabel('风速');
title('BP神经网络预测的结果');
figure;
plot((testvalue1-T2),'r-');
legend('预测的绝对误差');
for i=1:length(t2)
tm{1,i}=datestr(t2(i),'HH:MM');
end
set(gca,'xticklabel',tm);
xlabel('时间');
ylabel('绝对误差');
title('BP神经网络预测的绝对误差');
figure;
plot((testvalue1-T2)./T2*100,'r-');
for i=1:length(t2)
tm{1,i}=datestr(t2(i),'HH:MM');
end
set(gca,'xticklabel',tm);
legend('预测的相对误差');
xlabel('时间');
ylabel('误差(%)');
title('BP神经网络预测的误差');
disp('最佳隐含节点数');
hnumberbest
disp([filename1,'BP神经网络训练的RMSE']);
RMSETrain1
disp('实际风速');
T2
disp('全部数据输入的BP神经网络预测结果');
testvalue1
E1=testvalue1-T2;%绝对误差
E2=(testvalue1-T2)./T2*100;%相对误差
%% 输出结果到Excel
outcell={'时间(h)','实际风速','BP预测风速','预测的绝对误差','预测的相抵误差(%)'};
datacell=[t2',T2',testvalue1',E1',E2'];
datacell=num2cell(datacell);
outcell=[outcell;
datacell];
xlswrite('BP神经网络预测结果.xls',outcell);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。