BP神经网络实现风功率预测

风功率预测的方式主要有两种,一种为BP神经网络预测,另一种为ARMA时间序列预测。
以下为用MATLAB实现BP神经网络预测风速的代码。
学习使用MATLAB神经网络工具箱看过的书籍。
在这里插入图片描述

输入的数据是风速数据。

%% 本脚为实现BP神经网络对时间序列数据的预测--应用于风速预测
%输入为一系列风速数据即可预测下一时间节点的风速值
%% 导入数据
clc,clear,close all
load('windspeedoutT.mat');   %导入风速的.mat文件
T=windspeedoutT;   %输入风速文件
figure  %创建新的窗口
plot(T)  %在新窗口命令后画风速图,默认为在最新的窗口画图
%% 定义训练集与测试集的个数
num_all_data = length(T);
% 前75%的数据作为训练数据
num_train = floor( num_all_data * 0.75 );  %训练数据个数不能整除时向下取整
% 后25%的数据作为测试数据
num_test = num_all_data - num_train;
% 转化为narnet需要的序列数据(神经网络需要的数据为横向排列的元胞数组的形式)
y_train_nn = num2cell(T(1:num_train) )';
y_test_nn = num2cell(T(1+num_train:end))';
%% 网络的建立 
%延迟,即当前值依赖于过去的多少个值
feedback_delays = 1:10;
% 隐含层节点的个数
num_hd_neuron = 4;   
% narnet构建
net = narnet(feedback_delays, num_hd_neuron);   %建立narnet网络(非线性自结合的时间序列网络)
[Xs,Xi,Ai,Ts] = preparets(net,{
    
    },{
    
    }, y_train_nn);   %实现时间序列数据自动编排,Xs、Xi编排之后的输入和输出,Xi、Ai是初始化输入延迟状态和初始层延迟状态
[net,tr]  = train(net,Xs,Ts,Xi,Ai);     %训练网络 输入编排过后的相应数据 
%view(net)  %展示网络图形
figure
plotperform(tr)   %输出训练过程均方差值变化过程
Y = net(Xs,Xi);   %使用该网络得到输出
perf = perform(net,Ts,Y);  %计算网络的均方差
fprintf( 'neural network: mse on training set : %.6f\n', perf );  %输出均方差
%% 神经网络进行预测(测试集范围内预测)
yini = y_train_nn(end-max(feedback_delays)+1:end);   %取出训练集最后没用到的值
[Xs,Xi,Ai] = preparets(net,{
    
    },{
    
    },[yini y_test_nn]);    %[数组1 数组2]  表示拼接
y_pred_nn = net(Xs,Xi,Ai)';  %调用网络进行预测
y_pred_nn = cell2mat( y_pred_nn );   
y_test_nn = cell2mat( y_test_nn )';
%% 神经网络预测全数据集
y_train_test_all = num2cell(T)';
[Xs,Xi,Ai] = preparets(net,{},{},y_train_test_all);    %[数组1 数组2]  表示拼接
y_pred_all = net(Xs,Xi,Ai)';  %调用网络进行预测
y_pred_all = cell2mat( y_pred_all );   
figure
title('NARNET预测')
hold on
plot( T(10:1300), 'r', 'linewidth', 2 ); %测试数据实际值曲线
plot( y_pred_all, 'b--', 'linewidth', 2 ); %测试数据的预测值曲线
legend({
    
     '真实值', '神经网络预测值'})
 %% 预测测试集未来的数值
% [Y,Xf,Af] = net(Xs,Xi,Ai);
% [netc,Xic,Aic] = closeloop(net,Xf,Af); %实现闭环
% %view(netc)
% y_predict=netc(cell(0,2),Xic,Aic);   
% y_predict = cell2mat( y_predict )';
% %plot(y22);
% %% 画图,计算mse
% figure
% title('NARNET预测')
% hold on
% plot( y_test_nn, 'r', 'linewidth', 2 ); %测试数据实际值曲线
% plot( y_pred_nn, 'b--', 'linewidth', 2 ); %测试数据的预测值曲线
% legend({ '真实值', '神经网络预测值'}) 
% 
% figure
% title('NARNET预测之后')
% hold on
% plot( y_test_nn, 'r', 'linewidth', 2 ); %测试数据实际值曲线
% plot( [y_pred_nn;y_predict], 'b--', 'linewidth', 2 ); %测试数据的预测值曲线

nn_per_error = mean(abs(y_pred_nn-y_test_nn) ./ y_test_nn); %相对误差
nn_mse_error = mean( (y_pred_nn - y_test_nn).^2 ); %均方差
fprintf('nn model: relative error on test set: %.6f\n', nn_per_error);
fprintf('nn model: mse on test set: %.6f\n', nn_mse_error)

本着取自CSDN,还之CSDN,记录下来,以备后用,如有不妥的地方欢迎指出。

猜你喜欢

转载自blog.csdn.net/ananbai/article/details/123478817