基于matlab的长短期神经网络LSTM的电力负荷预测

目录
背影
摘要
LSTM的基本定义
LSTM实现的步骤
基于长短期神经网络LSTM的电力负荷预测
MATALB代码
效果图
结果分析
展望
参考论文

背影

电力负荷预测的实质是从已知的电力系统,经济,社会,气象等情况出发,根据历史负荷变化规律,对未来某个时刻或时段做出预先估计和推测,长短期神经网络依据自身的优点,准确的对电力负荷进行预测。
摘要
LSTM原理,MATALB编程长短期神经网络LSTM的电力负荷预测。

LSTM的基本定义

LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为它可以记忆不定时间长度的数值,区块中有一个gate能够决定input是否重要到能被记住及能不能被输出output。
图1底下是四个S函数单元,最左边函数依情况可能成为区块的input,右边三个会经过gate决定input是否能传入区块,左边第二个为input gate,如果这里产出近似于零,将把这里的值挡住,不会进到下一层。左边第三个是forget gate,当这产生值近似于零,将把区块里记住的值忘掉。第四个也就是最右边的input为output gate,他可以决定在区块记忆中的input是否能输出 。
图1 LSTM模型
图1 LSTM模型
LSTM有很多个版本,其中一个重要的版本是GRU(Gated Recurrent Unit),根据谷歌的测试表明,LSTM中最重要的是Forget gate,其次是Input gate,最次是Output gate

训练方法

为了最小化训练误差,梯度下降法(Gradient descent)如:应用时序性倒传递算法,可用来依据错误修改每次的权重。梯度下降法在递回神经网络(RNN)中主要的问题初次在1991年发现,就是误差梯度随着事件间的时间长度成指数般的消失。当设置了LSTM 区块时,误差也随着倒回计算,从output影响回input阶段的每一个gate,直到这个数值被过滤掉。因此正常的倒传递类神经是一个有效训练LSTM区块记住长时间数值的方法。

lstm的步骤

1 , LSTM的第一步是确定我们将从单元状态中丢弃哪些信息,这个策略有一个被称为遗忘门的sigmoid层决定。输入ht-1和xt遗忘门对应单元状态ct-1中每个数输出一个0到1之间的数字。1代表“完全保持”,0表示“完全遗忘”。

让那个我们回到我们的语言模型例子中尝试基于所有之前的词预测下一个词是什么。在这个问题中,单元状态中可能包括当前主题的性别,因此可以预测正确代词。当我们看到一个新的主题的性别时,我们想要忘记旧主题的性别。

=(W*[h-1,x]+b)

下一步将决定我们在单元状态中保存那些新信息。包括两个部分;第一”输入门层”的sigmoid层决定我们将更新那些值,第二,tanh层创建可以添加到状态的新候选值ct-1的向量。在下一步中,我们将结合这两个来创建状态更新。

在我们语言模型的例子中,我们想要将新主题的性别添加到单元格状态,以替换我们忘记的旧主题

=(W*[h-1,x]+b)

=tanh(W*[h-1,x]+b)

现在是时候将旧的单元状态ct-1更新为新的单元状态ct,之前的步骤已经决定要做什么,我们只需要实际做到这一点。我们将旧状态乘以ft,忘记我们之前决定忘记的事情,然后我们添加*Ct .这是新的候选值,根据我们的决定更新每个州的值来缩放。

在语言模型的情况下,我们实际上放弃了关于旧主题的性别的信息并添加新信息,正如我们在前面的步骤中所做的那样。

C=C-1+(1-)

最后,我们需要决定我们要输出的内容,此输出将基于我们的单元状态,但将是过滤版本,首先,我们运行一个sigmoid层,它决定我们要输出的单元状态的哪些部分,然后我们将单元状态设置为tanh(将值推到介于-1和1之间)并将其乘以sigmoid门的输出,以便我们只输出我们决定的部分。

对于语言模型示例,由于它只是看到一个主题,他可能想要输出与动物相关的信息,以防接下来会发生什么,例如,他输出主语是单数还是复数,一边我们知道动词应该与什么形式供轭。

O=(W[h-1,x]+b)

h=O*tanh©

​基于MATLAB编程的lstm长短期神经网络的电力负荷预测

clc
clc
clear
close all
num = xlsread(‘负荷数据.xlsx’,2);
train_data1 = num(:,1:5)‘;%训练数据的输入数据
test_data1 = num(:,6)’;%训练数据的输出数据
[train_data,inputps]=mapminmax(train_data1,0,1);%训练数据的输入数据的归一化
[trainout,outputps]=mapminmax(test_data1,0,1);%训练数据的输出数据的归一化

data_length=size(train_data,1);
data_num=size(train_data,2);
%% 网络参数初始化
% 结点数设置
input_num=5;
cell_num=12;
output_num=2;

% 网络中门的偏置
bias_input_gate=rand(1,cell_num);
bias_forget_gate=rand(1,cell_num);
bias_output_gate=rand(1,cell_num);
% ab=1.2;
% bias_input_gate=ones(1,cell_num)/ab;
% bias_forget_gate=ones(1,cell_num)/ab;
% bias_output_gate=ones(1,cell_num)/ab;
%网络权重初始化
ab=15;
weight_input_x=rand(input_num,cell_num)/ab;
weight_input_h=rand(output_num,cell_num)/ab;
weight_inputgate_x=rand(input_num,cell_num)/ab;
weight_inputgate_c=rand(cell_num,cell_num)/ab;
weight_forgetgate_x=rand(input_num,cell_num)/ab;
weight_forgetgate_c=rand(cell_num,cell_num)/ab;
weight_outputgate_x=rand(input_num,cell_num)/ab;
weight_outputgate_c=rand(cell_num,cell_num)/ab;

%hidden_output权重
weight_preh_h=rand(cell_num,output_num);

%网络状态初始化
cost_gate=1e-10;
h_state=rand(output_num,data_num);
cell_state=rand(cell_num,data_num);
%% 网络训练学习
for iter=1:3000
iter
yita=0.1; %每次迭代权重调整比例
for m=1:data_num

    %前馈部分
    if(m==1)
        gate=tanh(train_data(:,m)'*weight_input_x);
        input_gate_input=train_data(:,m)'*weight_inputgate_x+bias_input_gate;
        output_gate_input=train_data(:,m)'*weight_outputgate_x+bias_output_gate;
        for n=1:cell_num
            input_gate(1,n)=1/(1+exp(-input_gate_input(1,n)));
            output_gate(1,n)=1/(1+exp(-output_gate_input(1,n)));
        end
        forget_gate=zeros(1,cell_num);
        forget_gate_input=zeros(1,cell_num);
        cell_state(:,m)=(input_gate.*gate)';
    else
        gate=tanh(train_data(:,m)'*weight_input_x+h_state(:,m-1)'*weight_input_h);
        input_gate_input=train_data(:,m)'*weight_inputgate_x+cell_state(:,m-1)'*weight_inputgate_c+bias_input_gate;
        forget_gate_input=train_data(:,m)'*weight_forgetgate_x+cell_state(:,m-1)'*weight_forgetgate_c+bias_forget_gate;
        output_gate_input=train_data(:,m)'*weight_outputgate_x+cell_state(:,m-1)'*weight_outputgate_c+bias_output_gate;
        for n=1:cell_num
            input_gate(1,n)=1/(1+exp(-input_gate_input(1,n)));
            forget_gate(1,n)=1/(1+exp(-forget_gate_input(1,n)));
            output_gate(1,n)=1/(1+exp(-output_gate_input(1,n)));
        end
        cell_state(:,m)=(input_gate.*gate+cell_state(:,m-1)'.*forget_gate)';   
    end
    pre_h_state=tanh(cell_state(:,m)').*output_gate;
    h_state(:,m)=(pre_h_state*weight_preh_h)';
    %误差计算
    Error=h_state(:,m)-trainout(:,m);
    Error_Cost(1,iter)=sum(Error.^2);
    if(Error_Cost(1,iter)<cost_gate)
        flag=1;
        break;
    else
        [   weight_input_x,...
            weight_input_h,...
            weight_inputgate_x,...
            weight_inputgate_c,...
            weight_forgetgate_x,...
            weight_forgetgate_c,...
            weight_outputgate_x,...
            weight_outputgate_c,...
            weight_preh_h ]=fun_weight(m,yita,Error,...
                                               weight_input_x,...
                                               weight_input_h,...
                                               weight_inputgate_x,...
                                               weight_inputgate_c,...
                                               weight_forgetgate_x,...
                                               weight_forgetgate_c,...
                                               weight_outputgate_x,...
                                               weight_outputgate_c,...
                                               weight_preh_h,...
                                               cell_state,h_state,...
                                               input_gate,forget_gate,...
                                               output_gate,gate,...
                                               train_data,pre_h_state,...
                                               input_gate_input,...
                                               output_gate_input,...
                                               forget_gate_input);

    end
end
if(Error_Cost(1,iter)<cost_gate)
    break;
end

end
plot(Error_Cost,‘k-*’);
title(‘误差曲线图’);

%数据加载
test_final11=num((601:721),1:5’;%测试数据的输入数据
test_final1=mapminmax(‘apply’,test_final11,inputps);
test_output=num((601:721),6)‘; %测试数据的输出数据
%前馈
m=601:721;
lstmout= [];
for ii = 1:121
test_final = test_final1(:,ii);
gate=tanh(test_final’*weight_input_x+h_state(:,m(ii)-1)‘*weight_input_h);
input_gate_input=test_final’*weight_inputgate_x+cell_state(:,m(ii)-1)‘*weight_inputgate_c+bias_input_gate;
forget_gate_input=test_final’*weight_forgetgate_x+cell_state(:,m(ii)-1)‘*weight_forgetgate_c+bias_forget_gate;
output_gate_input=test_final’*weight_outputgate_x+cell_state(:,m(ii)-1)‘*weight_outputgate_c+bias_output_gate;
for n=1:cell_num
input_gate(1,n)=1/(1+exp(-input_gate_input(1,n)));
forget_gate(1,n)=1/(1+exp(-forget_gate_input(1,n)));
output_gate(1,n)=1/(1+exp(-output_gate_input(1,n)));
end
cell_state_test=(input_gate.*gate+cell_state(:,m(ii)-1)’.*forget_gate)‘;
pre_h_state=tanh(cell_state_test’).output_gate;
h_state_test=(pre_h_state
weight_preh_h)';
lstmout = [lstmout h_state_test];

end
% test_output
% lstmout
% test_output1 = (mapminmax(‘reverse’,test_output,outputps));
lstmout1= (mapminmax(‘reverse’,lstmout,outputps));

结果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

结果分析

从图中可以看出来,基于长短期神经网络LSTM的电力负荷预测 ,预测准确,泛发性好

展望

长短期神经网络在处理有时间关联性的问题方面,拥有独特的优势,预测结果更平滑,稳定,并且可调参,负荷属于时间序列的数据,,LSTM可以和其他是算法结合,比如粒子群优化LSTM参数,DBN+LSTM,等

参考论文

百科

猜你喜欢

转载自blog.csdn.net/abc991835105/article/details/130319270