1 简介
为了提高短期光伏发电预测的准确性,文中采用深度置信网络(DBN)建立了各模型函数的预测模型.通过分析各模型函数的特征,建立了光伏发电模型的功率预测.传统的基于神经网络的功率预测难以训练多层网络,影响其预测精度.DBN采用无监督贪婪逐层训练算法构建了一个在回归预测分析中具有优异性能的多隐层网络结构,已成为深度学习领域的研究热点.DBN连接权重采用结合粒子群优化算法优化,避免出现由随机初始化导致的局部最优解现象,从而提高了DBN网络预测性能.最后,案例测试显示了所提出模型的有效性.
2 部分代码
clc;clear;format compact;close all;tic
rng('default')
%% 数据预处理
data=xlsread('E15-海坝风电场-发电机前轴异常.csv','B3:BR17569');
% 特征变量选择 风速/发电功率/发电机转速/发电机转矩/发电机空冷温度/发电机前轴温度a/发电机前轴温度b/
% 发电机绕组u1温度/发电机绕组v1温度/发电机绕组w1温度/主轴叶轮侧温度
scadaE01data = [data(:,64),data(:,17),...
data(:,26),data(:,25),...
data(:,8),data(:,6),...
data(:,7),data(:,9),...
data(:,11),data(:,13),data(:,19)];
train_data = scadaE01data(1:10000,1:end);
test_data = scadaE01data(10001:13000,1:end);
%数据归一化
% [xs,mappingx]=mapminmax(x',0,1);x=xs';
% [ys,mappingy]=mapminmax(y',0,1);y=ys';
%训练集数据归一化
train_data = train_data';
train_min_max = minmax(train_data);
for ml = 1:11
for n1 = 1:length(train_data')
train_data(ml,n1) = (train_data(ml,n1)-train_min_max(ml,1))/(train_min_max(ml,2)-train_min_max(ml,1));
end
end
train_x = train_data';
%测试集数据归一化
test_data = test_data';
test_min_max = minmax(test_data);
for ml = 1:11
for n1 = 1:length(test_data')
test_data(ml,n1) = (test_data(ml,n1)-test_min_max(ml,1))/(test_min_max(ml,2)-test_min_max(ml,1));
end
end
test_x = test_data';
%% PSO参数
hid = 4; %隐含层数
hmax = 100;hmin = 1; %各隐含层节点数取值区间
%%
h = PSONEW(hid,hmax,hmin); %PSO优化隐含层节点数
%%
%train dbn
dbn.sizes = h;
% dbn.sizes = [38 71 79 34];%设置4个RBM与隐含层节点
opts.numepochs = 100;%训练次数
opts.batchsize = 100;%每次随机的样本数量
opts.momentum = 0;%动量,更新方向
opts.alpha = 0.1;%学习率
opts.show = 1;% 这个设置为1的话 命令行窗口要一直显示每一个迭代的误差,从而影响训练速度
dbn = dbnsetup(dbn, train_x, opts);%建立DBN
dbn = dbntrain(dbn, train_x, opts);%训练DBN
%unfold dbn to nn
nn = dbnunfoldtonn(dbn, 11);%将各训练好的RBM用于初始DBN
nn.activation_function = 'sigm';%隐含层激活函数
nn.output='linear';%回归预测的输出层用线性激活
nn.learningRate=0.1;%学习率
%train nn 微调
opts1.numepochs = 100;%训练次数
opts1.batchsize = 4;%batchsize
opts1.show = 1;% 这个设置为1的话 命令行窗口要一直显示每一个迭代的误差,从而影响训练速度
nn = nntrain(nn, train_x, train_x, opts1);
figure
plot(nn.loss)
%% predict
[~,predict_train] = nnpredict(nn, train_x);
% 反归一化
% predict_value0=mapminmax('reverse',pred0',mappingx);
% true_value0=mapminmax('reverse',train_x',mappingx);
[~,predict_test] = nnpredict(nn, test_x);
% 反归一化
% predict_value=mapminmax('reverse',pred',mappingy);
% true_value=mapminmax('reverse',test_x',mappingy);
% save dbn predict_value true_value% 保存数据 以后就可以直接画图
%% 用保存下来的数据画图,并计算误差
% for i = 1:10
% load dbn
% disp('DBN的结果分析')
% rmse=sqrt(mean((true_value0(i,:)-predict_value0(i,:)).^2));
% disp(['根均方差(RMSE):',num2str(rmse)])
%
% mae=mean(abs(true_value0(i,:)-predict_value0(i,:)));
% disp(['平均绝对误差(MAE):',num2str(mae)])
%
% mape=mean(abs(true_value0(i,:)-predict_value0(i,:))/true_value0(i,:));
% disp(['平均相对百分误差(MAPE):',num2str(mape*100),'%'])
%
% fprintf('\n')
% end
for i = 1:10
figure
plot(predict_train(:,i),'b','linewidth',1)
hold on
plot(train_x(:,i),'r','linewidth',1)
legend('实际值','预测值')
grid on
ylabel('风速')
xlabel('5月份最后5天的值')
title('DBN')
end
for i = 1:10
figure
plot(predict_test(:,i),'b','linewidth',1)
hold on
plot(test_x(:,i),'r','linewidth',1)
legend('实际值','预测值')
grid on
ylabel('风速')
xlabel('5月份最后5天的值')
title('DBN')
end
train_cancha = predict_train - train_x;
for i=1:length(train_cancha)
Re_train(i,:) = norm(train_cancha(i,:),2);
end
figure
hold on
plot(Re_train)
test_cancha = predict_test - test_x;
for i=1:length(test_cancha)
Re_test(i,:) = norm(test_cancha(i,:),2);
end
figure
hold on
plot(Re_test)
%%
toc
3 仿真结果
4 参考文献
[1]孙辉, & 冷建伟. (2020). 基于结合混沌纵横交叉的pso-dbn的短期光伏功率预测. 电测与仪表, 57(6), 6.
部分理论引用网络文献,若有侵权联系博主删除。