风电功率预测基于matlab粒子群算法优化LSTM风电功率预测含Matlab源码 941期

Posted 紫极神光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了风电功率预测基于matlab粒子群算法优化LSTM风电功率预测含Matlab源码 941期相关的知识,希望对你有一定的参考价值。

一、简介

1 粒子群算法的概念
粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解.
PSO的优势:在于简单容易实现并且没有许多参数的调节。目前已被广泛应用于函数优化、神经网络训练、模糊系统控制以及其他遗传算法的应用领域。

2 粒子群算法分析
2.1基本思想
粒子群算法通过设计一种无质量的粒子来模拟鸟群中的鸟,粒子仅具有两个属性:速度和位置,速度代表移动的快慢,位置代表移动的方向。每个粒子在搜索空间中单独的搜寻最优解,并将其记为当前个体极值,并将个体极值与整个粒子群里的其他粒子共享,找到最优的那个个体极值作为整个粒子群的当前全局最优解,粒子群中的所有粒子根据自己找到的当前个体极值和整个粒子群共享的当前全局最优解来调整自己的速度和位置。下面的动图很形象地展示了PSO算法的过程:

2 更新规则
PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次的迭代中,粒子通过跟踪两个“极值”(pbest,gbest)来更新自己。在找到这两个最优值后,粒子通过下面的公式来更新自己的速度和位置。

公式(1)的第一部分称为【记忆项】,表示上次速度大小和方向的影响;公式(1)的第二部分称为【自身认知项】,是从当前点指向粒子自身最好点的一个矢量,表示粒子的动作来源于自己经验的部分;公式(1)的第三部分称为【群体认知项】,是一个从当前点指向种群最好点的矢量,反映了粒子间的协同合作和知识共享。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。以上面两个公式为基础,形成了PSO的标准形式。

公式(2)和 公式(3)被视为标准PSO算法。
3 PSO算法的流程和伪代码

二、源代码

%%%% 基于粒子群算法优化lstm预测单序列
clc
clear all
close all
%加载数据,重构为行向量
%加载数据,重构为行向量
data =xlsread('台风日数据2','Sheet1','B2:E481');%把你的负荷数据赋值给data变量就可以了。

%%

%序列的前 90% 用于训练,后 10% 用于测试
numTimeStepsTrain =round(0.8*size(data,1));
dataTrain = data(1:numTimeStepsTrain,:)';
dataTest = data(numTimeStepsTrain+1:end-1,:)';
numTimeStepsTest = size(data,1)-numTimeStepsTrain-1 ;%步数
%%  数据归一化
[dataTrainStandardized, ps_input] = mapminmax(dataTrain,0,1);
[dataTestStandardized, ps_output] = mapminmax(dataTest,0,1);
%输入LSTM的时间序列交替一个时间步
XTrain = dataTrainStandardized(2:end,:);
YTrain = dataTrainStandardized(1,:);
[dataTrainStandardized_zong, ps_input_zong] = mapminmax(data',0,1);
XTest_zong = dataTrainStandardized_zong(2:end,end);%测试集输入
YTest_zong = dataTest(1,1)';%测试集输出
XTest = dataTestStandardized(2:end,:);%测试集输入
YTest = dataTest(1,:)';%测试集输出
%%
%创建LSTM回归网络,指定LSTM层的隐含单元个数96*3
%序列预测,因此,输入一维,输出一维
numFeatures = 3;%输入层数
numResponses = 1;%输出层数
numHiddenUnits = 20*3;

layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits)
    fullyConnectedLayer(numResponses)
    regressionLayer];
%% 初始化种群
N = 5;                         % 初始种群个数
d = 1;                          % 空间维数
ger =100;                      % 最大迭代次数
limit = [0.001, 0.01;];                % 设置位置参数限制(矩阵的形式可以多维)
vlimit = [-0.005, 0.005;];               % 设置速度限制
c_1 = 0.8;                        % 惯性权重
c_2 = 0.5;                       % 自我学习因子
c_3 = 0.5;                       % 群体学习因子
for i = 1:d
    x(:,i) = limit(i, 1) + (limit(i, 2) - limit(i, 1)) * rand(N, 1);%初始种群的位置
end
v = 0.005*rand(N, d);                  % 初始种群的速度
xm = x;                          % 每个个体的历史最佳位置
ym = zeros(1, d);                % 种群的历史最佳位置
fxm = 1000*ones(N, 1);               % 每个个体的历史最佳适应度
fym = 1000;                      % 种群历史最佳适应度
%% 粒子群工作
iter = 1;
times = 1;
record = zeros(ger, 1);          % 记录器
while iter <= ger
    iter
    for i=1:N
                %指定训练选项,求解器设置为adam, 250 轮训练。
        %梯度阈值设置为 1。指定初始学习率 0.005,在 125 轮训练后通过乘以因子 0.2 来降低学习率。
        options = trainingOptions('adam', ...
            'MaxEpochs',250, ...
            'GradientThreshold',1, ...
            'InitialLearnRate',x(i,:), ...
            'LearnRateSchedule','piecewise', ...
            'LearnRateDropPeriod',125, ...
            'LearnRateDropFactor',0.1, ...
            'Verbose',0);
        %训练LSTM
        net = trainNetwork(XTrain,YTrain,layers,options);%训练网络
        net = resetState(net);
        net = predictAndUpdateState(net,XTrain);%
        YPred1 = [];
        
        for mm = 1:numTimeStepsTest
            [net,YPred1(:,mm)] = predictAndUpdateState(net,XTest(:,mm),'ExecutionEnvironment','cpu');%%预测
        end
        mint=ps_output.xmin(1);
        maxt=ps_output.xmax(1);
        YPred=postmnmx(YPred1,mint,maxt);%反归一化
        
        for mm = 1:numTimeStepsTest
            
            if dataTest(2,mm)>25
                YPred(mm)=0;
            end
        end
        
        %使用先前计算的参数对预测去标准化。
        %计算均方根误差 (RMSE)。
        
        rmse = sqrt(mean((YPred-YTest').^2));%均方差
        fx(i) = rmse ; % 个体当前适应度
    end
    for i = 1:N
        if fxm(i) > fx(i)
            fxm(i) = fx(i);     % 更新个体历史最佳适应度
            xm(i,:) = x(i,:);   % 更新个体历史最佳位置
            YPred_best1=YPred;
        end
    end
    if fym > min(fxm)
        [fym, nmax] = min(fxm);   % 更新群体历史最佳适应度
        ym = xm(nmax, :);      % 更新群体历史最佳位置
        YPred_best=YPred_best1;
    end
    %%
clc
clear all
close all
%加载数据,重构为行向量
data =xlsread('台风日数据2','Sheet1','B2:E481');%把你的负荷数据赋值给data变量就可以了。

%%

%序列的前 90% 用于训练,后 10% 用于测试
numTimeStepsTrain =round(0.8*size(data,1));
dataTrain = data(1:numTimeStepsTrain,:)';
dataTest = data(numTimeStepsTrain+1:end-1,:)';
        numTimeStepsTest = size(data,1)-numTimeStepsTrain-1 ;%步数
%%  数据归一化
[dataTrainStandardized, ps_input] = mapminmax(dataTrain,0,1);
[dataTestStandardized, ps_output] = mapminmax(dataTest,0,1);
%输入LSTM的时间序列交替一个时间步
XTrain = dataTrainStandardized(2:end,:);
YTrain = dataTrainStandardized(1,:);
[dataTrainStandardized_zong, ps_input_zong] = mapminmax(data',0,1);
XTest_zong = dataTrainStandardized_zong(2:end,end);%测试集输入
YTest_zong = dataTest(1,1)';%测试集输出
XTest = dataTestStandardized(2:end,:);%测试集输入
YTest = dataTest(1,:)';%测试集输出

三、运行结果

四、备注

版本:2019b

以上是关于风电功率预测基于matlab粒子群算法优化LSTM风电功率预测含Matlab源码 941期的主要内容,如果未能解决你的问题,请参考以下文章

风电功率预测基于matlab粒子群算法优化BP神经网络风电功率预测含Matlab源码 347期

风电功率预测基于matlab灰狼算法优化LSTM风电功率预测含Matlab源码 2004期

风电功率预测基于matlab灰狼算法优化LSTM风电功率预测含Matlab源码 1392期

风电功率预测基于matlab EMD优化LSTM风电功率预测含Matlab源码 1402期

电力负荷预测基于matlab粒子群算法优化LSTM短期电力负荷预测含Matlab源码 1232期

lstm预测基于粒子群优化lstm预测matlab源码