1 简介
在人工神经网络的实际应用中, 大多数的人工神经网络模型是采用前馈反向传播网络 ( Back- Propagation Net work , 简称 BP网络 )或它的变化形式。它是前向网络的核心, 体现了人工神经网络最精华的部分。近年来 MATLAB因 其编程效率高, 易学易懂, 被广泛应用。比如BP神经网络已被广泛应用在非线性建摸、函数逼近、系统辨识等诸多方面, 但对实际问题, 其模型结构需由实验数据确定, 无规律可寻。本文引用了历年浦东房价的已知数据,简要利用 MATLAB语言进行 BP网络建立、训练、仿真,通过训练的网络来预测下个月和下下个月的房价。简单以浦东房屋均价预测为例, 表明可以通过 MATLAB实现利用BP神经网络简单预测。
Rumelhart,McClelland于1985年提出了BP网络的误差反向后传BP(Back Propagation)学习算法。
BP算法基本原理:利用输出后的误差来估计输出层的直接前导层的误差,再用这个误差估计更前一层的误差,如此一层一层的反传下去,就获得了所有其他各层的误差估计。它是一种 监督式的学习算法, 通过连续不断地在相对于误差函数斜率下降的方向上计算网络权值和偏差的变化而逐渐逼近目标。每一次权值和偏差的变化都与网络误差的影响成正比 , 并以反向传播的方式传递到每一层。BP学习算法由两部分组成:信息的正向传播与误差的反向传播。 在正向传播过程中, 输入信息从输入经隐含层逐层计算传向输出层, 每一层神经元的状态只影响下一层神经元的状态。如果在输出层没有得到期望的输出, 则计算输出层的误差变化值, 然后转向反向传播, 通过网络将误差信号沿原来的连接通路反传回来修改各层神经元的权值直至达到期望目标。
2 部分代码
clear; clc;
TestSamNum = 20; % 学习样本数量
ForcastSamNum = 2; % 预测样本数量
HiddenUnitNum=8; % 隐含层
InDim = 3; % 输入层
OutDim = 1; % 输出层
% 原始数据
% 2018年1月到2019年8月浦东房屋均价(单位:元\平米)
s1 = [54344 54310 53949 53250 53122 53148 53266 51665 50844 50379 49971 48993 48678 48809 48732 49166 48996 49714 49955 49841 ];
% 2018年2月到2019年9月浦东房屋均价(单位:元\平米)
s2 = [54310 53949 53250 53122 53148 53266 51665 50844 50379 49971 48993 48678 48809 48732 49166 48996 49714 49955 49841 50133];
% 2018年3月到2019年10月浦东房屋均价(单位:元\平米)
s3 = [53949 53250 53122 53148 53266 51665 50844 50379 49971 48993 48678 48809 48732 49166 48996 49714 49955 49841 50133 50585];
% 2018年4月到2019年11月浦东房屋均价(单位:元\平米)
gl = [ 53250 53122 53148 53266 51665 50844 50379 49971 48993 48678 48809 48732 49166 48996 49714 49955 49841 50133 50585 50749];
p = [s1; s2; s3]; % 输入数据矩阵
t = gl; % 目标数据矩阵
[SamIn, minp, maxp, tn, mint, maxt] = premnmx(p, t); % 原始样本对(输入和输出)初始化
SamOut = tn; % 输出样本
MaxEpochs = 50000; % 最大训练次数
lr = 0.05; % 学习率
E0 = 1e-3; % 目标误差
rng('default');
W1 = rand(HiddenUnitNum, InDim); % 初始化输入层与隐含层之间的权值
B1 = rand(HiddenUnitNum, 1); % 初始化输入层与隐含层之间的阈值
W2 = rand(OutDim, HiddenUnitNum); % 初始化输出层与隐含层之间的权值
B2 = rand(OutDim, 1); % 初始化输出层与隐含层之间的阈值
ErrHistory = zeros(MaxEpochs, 1);
for i = 1 : MaxEpochs
HiddenOut = logsig(W1*SamIn + repmat(B1, 1, TestSamNum)); % 隐含层网络输出
NetworkOut = W2*HiddenOut + repmat(B2, 1, TestSamNum); % 输出层网络输出
Error = SamOut - NetworkOut; % 实际输出与网络输出之差
SSE = sumsqr(Error); % 能量函数(误差平方和)
ErrHistory(i) = SSE;
if SSE < E0
break;
end
% 以下六行是BP网络最核心的程序
% 权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量
Delta2 = Error;
Delta1 = W2' * Delta2 .* HiddenOut .* (1 - HiddenOut);
dW2 = Delta2 * HiddenOut';
dB2 = Delta2 * ones(TestSamNum, 1);
dW1 = Delta1 * SamIn';
dB1 = Delta1 * ones(TestSamNum, 1);
% 对输出层与隐含层之间的权值和阈值进行修正
W2 = W2 + lr*dW2;
B2 = B2 + lr*dB2;
% 对输入层与隐含层之间的权值和阈值进行修正
W1 = W1 + lr*dW1;
B1 = B1 + lr*dB1;
end
HiddenOut = logsig(W1*SamIn + repmat(B1, 1, TestSamNum)); % 隐含层输出最终结果
NetworkOut = W2*HiddenOut + repmat(B2, 1, TestSamNum); % 输出层输出最终结果
a = postmnmx(NetworkOut, mint, maxt); % 还原网络输出层的结果
x=2000 :1: 2019; % 时间轴刻度
%set(gca,'xtick',x+2);
%set(gca, 'xticklabel',{'2018/04','2018/05','2018/06','2018/07','2018/08','2018/09','2018/10','2018/11','2018/12','2019/01','2019/02','2019/03','2019/04','2019/05','2019/06','2019/07','2019/08','2019/09','2019/10','2019/11'});
newsu = a(1, :); % 网络输出房价
% 利用训练好的网络进行预测
pyuce=[49841 50133 % 2019年8月价格 2019年9价格
50133 50585 % 2019年9月价格 2019年10价格
50585 50749 ]; % 2019年10月价格 2019年11价格
% 根据以上数据预测2019年12月和2020年1月的价格;
pnewn = tramnmx(pyuce, minp, maxp);
HiddenOut = logsig(W1*pnewn + repmat(B1, 1, ForcastSamNum)); % 隐含层输出预测结果
anewn = W2*HiddenOut + repmat(B2, 1, ForcastSamNum); % 输出层输出预测结果
zuihouzhi = postmnmx(anewn, mint, maxt);
disp('预测值d:');
disp(zuihouzhi);
plot(handles.wt_tu,x,newsu, 'r-o', x, gl, 'b--+',2020:2021,zuihouzhi,'b-o');
set(gca,'xtick',2000:1:2021);
C={'18/04','18/05','18/06','18/07','18/08','18/09','18/10','18/11','18/12','19/01','19/02','19/03','19/04','19/05','19/06','19/07','19/08','19/09','19/10','19/11','19/12','20/01'};
set(gca,'XTickLabel',C)
legend('网络训练输出房屋价格', '实际房屋价格','预测的后两个月的价格');
xlabel('时间');
ylabel('价格/元每平米');
3 仿真结果
4 参考文献
[1]何成. "基于MATLAB实现BP神经网络的水质预测." 中文科技期刊数据库(引文版)工程技术 :00251-00251.