时序预测 | MATLAB实现EMD-GWO-SVR经验模态分解结合灰狼算法优化支持向量机时间序列预测(含EMD-GWO-SVR、EMD-SVR、GWO-SVR、SVR对比)

时序预测 | MATLAB实现EMD-GWO-SVR经验模态分解结合灰狼算法优化支持向量机时间序列预测(含EMD-GWO-SVR、EMD-SVR、GWO-SVR、SVR对比)

预测效果

1
2
3
4
5
6

基本介绍

Matlab实现EMD-GWO-SVR、EMD-SVR、GWO-SVR、SVR时间序列预测,经验模态分解结合灰狼算法优化支持向量机、经验模态分解结合支持向量机、灰狼算法优化支持向量机、支持向量机时间序列预测(完整源码和数据)

模型介绍

EMD-GWO-SVR是一种基于经验模态分解(EMD)、灰狼优化算法(GWO)和支持向量机回归(SVR)的时间序列预测方法。
首先,使用EMD方法对原始时间序列进行分解,得到多个固有模态函数(IMF)。然后,使用GWO算法对每个IMF进行优化,得到最优的SVR模型参数。最后,将所有IMF的预测结果相加得到最终的预测结果。
EMD方法是一种将非线性和非平稳信号分解为若干个固有模态函数的方法,每个IMF都代表了原始信号在不同时间尺度上的振动模式。GWO算法是一种模拟灰狼捕猎行为的优化算法,能够寻找到全局最优解。SVR是一种基于核函数的非线性回归方法,能够处理高维度和非线性的数据。
EMD-GWO-SVR方法的优点是能够充分挖掘时间序列的非线性和非平稳特征,并且能够自适应地对每个IMF进行优化,提高了预测的准确性和鲁棒性。此外,GWO算法具有全局搜索能力,能够避免SVR模型陷入局部最优解。
EMD-GWO-SVR方法可以应用于各种时间序列预测问题,例如股票价格预测、气象数据预测、交通流量预测等。

程序设计

%% 各算法对比
clc;clear;close all
%%
svr=load('result/SVR.mat');
result(svr.T_test,svr.T_sim2,'SVR')

gwosvr=load('result/GWO-SVR.mat');
result(gwosvr.T_test,gwosvr.T_sim2,'GWO-SVR')

emdsvr=load('result/EMD-SVR.mat');
result(emdsvr.T_test,emdsvr.T_sim2,'EMD-SVR')

emdgwosvr=load('result/EMD-GWO-SVR.mat');
result(emdgwosvr.T_test,emdgwosvr.T_sim2,'EMD-GWO-SVR')
%%
figure
plot(svr.T_test,'-r')
hold on;grid on
plot(svr.T_sim2,'-c')
plot(gwosvr.T_sim2,'-g')
plot(emdsvr.T_sim2,'-k')
plot(emdgwosvr.T_sim2,'-b')

legend('真实值','SVR预测模型','GWO-SVR预测模型','EMD-SVR预测模型','EMD-GWO-SVR预测模型')
title('各算法结果')
xlabel('预测样本点坐标')
ylabel('值')
unction [Alpha_score,Alpha_pos,Convergence_curve,curve]=GWO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj)

%%  优化算法初始化
Alpha_pos = zeros(1, dim);  % 初始化Alpha狼的位置
Alpha_score = inf;          % 初始化Alpha狼的目标函数值,将其更改为-inf以解决最大化问题

Beta_pos = zeros(1, dim);   % 初始化Beta狼的位置
Beta_score = inf;           % 初始化Beta狼的目标函数值 ,将其更改为-inf以解决最大化问题

Delta_pos = zeros(1, dim);  % 初始化Delta狼的位置
Delta_score = inf;          % 初始化Delta狼的目标函数值,将其更改为-inf以解决最大化问题

%%  初始化搜索狼群的位置
Positions = initialization(SearchAgents_no, dim, ub, lb);

%%  用于记录迭代曲线
Convergence_curve = zeros(1, Max_iteration);
%%  循环计数器
iter = 0;

%%  优化算法主循环
while iter < Max_iteration           % 对迭代次数循环
    for i = 1 : size(Positions, 1)   % 遍历每个狼

        % 返回超出搜索空间边界的搜索狼群
        % 若搜索位置超过了搜索空间,需要重新回到搜索空间
        Flag4ub = Positions(i, :) > ub;
        Flag4lb = Positions(i, :) < lb;

        % 若狼的位置在最大值和最小值之间,则位置不需要调整,若超出最大值,最回到最大值边界
        % 若超出最小值,最回答最小值边界
        Positions(i, :) = (Positions(i, :) .* (~(Flag4ub + Flag4lb))) + ub .* Flag4ub + lb .* Flag4lb;   

        % 计算适应度函数值
%         Positions(i, 2) = round(Positions(i, 2));
%         fitness = fical(Positions(i, :));
          fitness = fobj(Positions(i, :));
        % 更新 Alpha, Beta, Delta
        if fitness < Alpha_score           % 如果目标函数值小于Alpha狼的目标函数值
            Alpha_score = fitness;         % 则将Alpha狼的目标函数值更新为最优目标函数值
            Alpha_pos = Positions(i, :);   % 同时将Alpha狼的位置更新为最优位置
        end

        if fitness > Alpha_score && fitness < Beta_score   % 如果目标函数值介于于Alpha狼和Beta狼的目标函数值之间
            Beta_score = fitness;                          % 则将Beta狼的目标函数值更新为最优目标函数值
            Beta_pos = Positions(i, :);                    % 同时更新Beta狼的位置
        end

        if fitness > Alpha_score && fitness > Beta_score && fitness < Delta_score  % 如果目标函数值介于于Beta狼和Delta狼的目标函数值之间
            Delta_score = fitness;                                                 % 则将Delta狼的目标函数值更新为最优目标函数值
            Delta_pos = Positions(i, :);                                           % 同时更新Delta狼的位置
        end

    end

    % 线性权重递减
    wa = 2 - iter * ((2) / Max_iteration);    

    % 更新搜索狼群的位置
    for i = 1 : size(Positions, 1)      % 遍历每个狼
        for j = 1 : size(Positions, 2)  % 遍历每个维度

            % 包围猎物,位置更新
            r1 = rand; % r1 is a random number in [0,1]
            r2 = rand; % r2 is a random number in [0,1]

            A1 = 2 * wa * r1 - wa;   % 计算系数A,Equation (3.3)
            C1 = 2 * r2;             % 计算系数C,Equation (3.4)

            % Alpha 位置更新
            D_alpha = abs(C1 * Alpha_pos(j) - Positions(i, j));   % Equation (3.5)-part 1
            X1 = Alpha_pos(j) - A1 * D_alpha;                     % Equation (3.6)-part 1

            r1 = rand; % r1 is a random number in [0,1]
            r2 = rand; % r2 is a random number in [0,1]

            A2 = 2 * wa * r1 - wa;   % 计算系数A,Equation (3.3)
            C2 = 2 *r2;              % 计算系数C,Equation (3.4)

            % Beta 位置更新
            D_beta = abs(C2 * Beta_pos(j) - Positions(i, j));    % Equation (3.5)-part 2
            X2 = Beta_pos(j) - A2 * D_beta;                      % Equation (3.6)-part 2       

            r1 = rand;  % r1 is a random number in [0,1]
            r2 = rand;  % r2 is a random number in [0,1]

            A3 = 2 *wa * r1 - wa;     % 计算系数A,Equation (3.3)
            C3 = 2 *r2;               % 计算系数C,Equation (3.4)

            % Delta 位置更新
            D_delta = abs(C3 * Delta_pos(j) - Positions(i, j));   % Equation (3.5)-part 3
            X3 = Delta_pos(j) - A3 * D_delta;                     % Equation (3.5)-part 3

            % 位置更新
            Positions(i, j) = (X1 + X2 + X3) / 3;                 % Equation (3.7)

        end
    end

    % 更新迭代器
    iter = iter + 1;    
    Convergence_curve(iter) = Alpha_score;
   curve(iter)=sum(Convergence_curve)/iter;
    disp(['第',num2str(iter),'次迭代'])
    disp(['current iteration is: ',num2str(iter), ', best fitness is: ', num2str(Alpha_score)]);
end

%%  记录最佳参数
% best_lr = Alpha_pos(1, 1);
% best_hd = Alpha_pos(1, 2);
% best_l2 = Alpha_pos(1, 3);
end
function result(true_value,predict_value,type)
disp(type)
rmse=sqrt(mean((true_value-predict_value).^2));
disp(['根均方差(RMSE):',num2str(rmse)])
mae=mean(abs(true_value-predict_value));
disp(['平均绝对误差(MAE):',num2str(mae)])
mape=mean(abs((true_value-predict_value)./true_value));
disp(['平均相对百分误差(MAPE):',num2str(mape*100),'%'])
r2 = R2(predict_value, true_value);
disp(['R平方决定系数(MAPE):',num2str(r2)])
nse = NSE(predict_value, true_value);
disp(['纳什系数(NSE):',num2str(nse)])

fprintf('\n')

参考资料

[1] https://blog.csdn.net/kjm13182345320?spm=1010.2135.3001.5343
[2] https://mianbaoduo.com/o/bread/mbd-YpiamZpq
[3] SI Y W,YIN J. OBST-based segmentation approach to financial time series[J]. Engineering Applications of Artificial Intelligence,2013,26( 10) : 2581-2596.
[4] YUAN X,CHEN C,JIANG M,et al. Prediction Interval of Wind Power Using Parameter Optimized Beta Distribution Based LSTM Model[J]. Applied Soft Computing,2019,82:105550.143

致谢

  • 大家的支持是我写作的动力!
  • 感谢大家订阅,记得备注!

猜你喜欢

转载自blog.csdn.net/kjm13182345320/article/details/131832840