近日受友人所托助力电力负荷预测试验,本篇结合《巧借循环对神经网络输出值控制得理想值【MATLAB】》 使用部分数据(由于复现文章导致数据不全)进行原理上的数据模拟进行试验,整体框架可供大家参考。
这里紧接《BP实现数据预测》一文中所述的流程和demo
demo
训练网络部分:
clc clear close all %% while 1 ==1 % old_datas = xlsread('ss.xlsx'); load old_datas.mat new_data2014 = 1.14.*old_datas; new_data2015 = 1.16.*old_datas; new_data2016 = 1.18.*old_datas; data20142016 = [new_data2014;new_data2015;new_data2016]; X = mapminmax(data20142016); data_x = [X(1:72,3:5)';X(1:72,7:10)']; data_y = X(1:72,6:6)'; %构建网络 net = newff(data_x,data_y ,[20], { 'logsig' 'purelin' } , 'traingdx' , 'learngdm') ;%输入数据为 特征数*数据个数,输出为 类别向量*数据个数 net.trainparam.show = 50 ;%每间隔50步显示一次训练结果 net.trainparam.epochs = 100;%允许最大训练步数100步 net.trainparam.goal = 0.01 ;%训练目标最小误差0.01 net.trainParam.lr = 0.001 ;%学习速率0.001 %% 开始训练 net = train( net, data_x,data_y); new_data2017 = 1.20.*old_datas; % 待测数据 X_test = mapminmax(new_data2017); input_test = [X_test(1:end,3:5)';X_test(1:end,7:10)']; output_test = X_test(1:end,6:6)'; test_Y = sim( net,input_test) ; mae_list = mean(abs(output_test - test_Y)); %平均绝对误差list list_x = 1:length(mae_list);% 平均绝对误差的横轴x maes = sum(mae_list)/(length(mae_list)); %计算平均绝对误差 if maes < 0.0176 break end end save MyNet.mat net
预测部分:
clc clear close all %% load MyNet.mat %调用网络 load old_datas.mat %调用数据 new_data2017 = 1.20.*old_datas; % 待测数据 X_test = mapminmax(new_data2017); input_test = [X_test(1:end,3:5)';X_test(1:end,7:10)']; output_test = X_test(1:end,6:6)'; test_Y = sim( net,input_test) ; ElecPrice_Ture = output_test; % 真实的电价 ElecPrice_Predict = test_Y; % 预测的的电价 figure(1) ElecPrice_x = 1:length(ElecPrice_Ture); % x轴绘画 plot(ElecPrice_x,ElecPrice_Ture,'r',ElecPrice_x,ElecPrice_Predict,'g') % 绘制真实电价和预测电价比较图 %% % 平均误差模块 mae_list = abs(output_test - test_Y); %平均绝对误差的list mae_list_x = 1:length(mae_list); figure plot(mae_list_x, mae_list) mae = mean(abs(output_test - test_Y))