一、前言
随着数据科学的快速发展,利用神经网络进行时序预测已经成为一个热门话题。BP(反向传播)神经网络因其强大的学习能力,广泛应用于各类预测任务。本文将介绍一套基于Matlab的BP神经网络时序预测代码,重点在于如何通过历史数据预测未来趋势。本文中的代码是完整可用的,读者只需复制到Matlab中即可运行。
二、代码部分
代码分为以下几个部分:初始化、数据读取、数据归一化、权值和阈值初始化、模型训练、预测以及作图。
1. 初始化
%% 1.初始化
clear
close all
clc
2. 数据读取
需要修改以下部分:
1.数据范围,例如A1:A16表示16年的数据。
2.延时算子,例如k+4中的4表示使用的历史数据点数。
%% 2.数据读取
data0 = xlsread('数据.xlsx', 'Sheet1', 'A1:A16');
b = data0(:, 1)';
data = cell2mat(arrayfun(@(k) b(k:k+4), 1:12, 'un', 0)'); % 转换矩阵
[rowLen, colLen] = size(data);
trainNum = rowLen; % 训练样本数量
hiddenNum = 10; % 隐含层神经元数量
input = colLen - 1; % 输入层神经元数量
output = 1; % 输出层神经元数量
p = data(:, 1:input)'; % 输入数据矩阵
t = data(:, colLen)'; % 目标数据矩阵
3. 数据归一化
使用mapminmax进行数据归一化,以提高训练效果。
%% 3.数据归一化
[SamIn, PSp] = mapminmax(p, -1, 1);
[tn, PSt] = mapminmax(t, -1, 1);
SamOut = tn; % 输出样本
MaxEpochs = 30000; % 最大训练次数
lr = 0.05; % 学习率
E0 = 1e-3; % 目标误差
rng('default');
4. 权值和阈值初始化
初始化权值和阈值,并设置训练循环。
%% 4.权值和阈值初始化
W1 = rand(hiddenNum, input); % 输入层与隐含层之间的权值
B1 = rand(hiddenNum, 1); % 隐含层偏置
W2 = rand(output, hiddenNum); % 隐含层与输出层之间的权值
B2 = rand(output, 1); % 输出层偏置
ErrHistory = zeros(MaxEpochs, 1);
for i = 1 : MaxEpochs
HiddenOut = logsig(W1 * SamIn + repmat(B1, 1, trainNum)); % 隐含层输出
NetworkOut = W2 * HiddenOut + repmat(B2, 1, trainNum); % 输出层输出
Error = SamOut - NetworkOut; % 计算误差
SSE = sumsqr(Error); % 误差平方和
ErrHistory(i) = SSE; % 记录误差
if SSE < E0 % 达到误差阈值退出
break;
end
% 计算权值更新
Delta2 = Error;
Delta1 = W2' * Delta2 .* HiddenOut .* (1 - HiddenOut);
dW2 = Delta2 * HiddenOut';
dB2 = Delta2 * ones(trainNum, 1);
dW1 = Delta1 * SamIn';
dB1 = Delta1 * ones(trainNum, 1);
% 更新权值和阈值
W2 = W2 + lr * dW2;
B2 = B2 + lr * dB2;
W1 = W1 + lr * dW1;
B1 = B1 + lr * dB1;
end
5. 预测
在此部分,设置未来数据的预测。
%% 5.预测
x = 1 : 12; % 样本数
ForcastSamNum = 1;
preP = zeros(1, 4);
pNew = data(end, 2:end)'; % 最后一行输入
for i = 1 : 4
pnew = pNew;
pnewn = mapminmax('apply', pnew, PSp); % 归一化
HiddenOut = logsig(W1 * pnewn + repmat(B1, 1, ForcastSamNum)); % 隐含层输出
anewn = W2 * HiddenOut + repmat(B2, 1, ForcastSamNum); % 输出层输出
anew = mapminmax('reverse', anewn, PSt); % 反归一化
preP(i) = anew; % 保存预测值
pNew = [pNew(2:end); anew]; % 更新输入
end
6. 作图
最后,对预测结果进行可视化。
%% 6.作图
figure
plot(x, t, 'k:o', 'linewidth', 1.5);
hold on
plot(x, mapminmax('reverse', W2 * logsig(W1 * SamIn + repmat(B1, 1, trainNum)) + repmat(B2, 1, trainNum), PSt), 'r-^', 'linewidth', 1.5);
hold on
plot(13:16, preP, 'b--h', 'linewidth', 1.5);
legend('真实值', '拟合值', '预测值');
xlabel('序列'), ylabel('指标值');
set(gca, 'fontsize', 12)
disp('预测值:');
disp(preP);
三、结果展示
四、结语
本文介绍了一种简单的BP神经网络时序预测方法,并提供了完整的Matlab代码。尽管该方法在某些情况下可能会出现收敛问题,但它为初学者提供了良好的学习基础。未来可以考虑使用更复杂的网络结构或优化算法来提高预测精度。希望这篇文章能够帮助你更好地理解BP神经网络在时序预测中的应用。
标签:预测,归一化,HiddenOut,神经网络,BP,W2,trainNum,权值 From: https://blog.csdn.net/2402_87132195/article/details/143188624