BP神经网络时序预测——预测未来(含完整代码)

一、前言

随着数据科学的快速发展,利用神经网络进行时序预测已经成为一个热门话题。BP(反向传播)神经网络因其强大的学习能力,广泛应用于各类预测任务。本文将介绍一套基于Matlab的BP神经网络时序预测代码,重点在于如何通过历史数据预测未来趋势。本文中的代码是完整可用的,读者只需复制到Matlab中即可运行。

Bp神经网络完整代码

二、代码部分

代码分为以下几个部分:初始化、数据读取、数据归一化、权值和阈值初始化、模型训练、预测以及作图。

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);

 

三、结果展示

267b89230d58478db2ee62cf30371f57.jpg

 

四、结语

本文介绍了一种简单的BP神经网络时序预测方法,并提供了完整的Matlab代码。尽管该方法在某些情况下可能会出现收敛问题,但它为初学者提供了良好的学习基础。未来可以考虑使用更复杂的网络结构或优化算法来提高预测精度。希望这篇文章能够帮助你更好地理解BP神经网络在时序预测中的应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值