基于PSO優化LSSVM的時序預測MATLAB實戰

        今天給大家分享PSO優化LSSVM的時序預測代碼實戰,主要從算法原理和代碼實戰展開。需要了解更多算法代碼的,可以點擊文章左下角的閱讀全文,進行獲取哦~需要了解智能算法、機器學習、深度學習和信號處理相關理論的可以后臺私信哦,下一期分享的內容就是你想了解的內容~

一、算法原理

    支持向量機是針對小樣本問題,基于結構風險最小化,較好地解決了以往機器學習模型中的過學習、非線性、維數災難以及局部極小值等問題,具有較好的泛化能力;然而,該方法在大規模訓練樣本時,存在訓練速度慢、穩定性差等缺陷,從而制約了其使用范圍(學習過程中需要求解二次規劃問題)。為加快支持向量機的訓練速度和簡化計算復雜度,最小二乘支持向量機(Least Square Support Vector Machine, LSSVM)被提出。最小二乘支持向量機(LSSVM)是標準支持向量機的一種擴展,該算法將支持 向量機的求解從二次規劃問題轉化為線性方程組。它與支持向量機的不同之處在于它把不等式約束改成等式約束,并把經驗風險由偏差的一次方改為二次方。

    本文分享的實戰為時序預測問題是一類回歸問題,因此接下來介紹的算法原理為最小二乘支持向量回歸算法(LSSVR)。

(1)構建LSSVR的優化問題的目標函數:

基于PSO優化LSSVM的時序預測MATLAB實戰的圖1

  (2) 將傳統SVM的不等式約束轉換為等式約束:

基于PSO優化LSSVM的時序預測MATLAB實戰的圖2

(3)構造拉格朗日函數:

基于PSO優化LSSVM的時序預測MATLAB實戰的圖3

(4)進行KKT轉換,得到最優對應的約束條件:

基于PSO優化LSSVM的時序預測MATLAB實戰的圖4

(5)得到對應的線性方程系統為:

基于PSO優化LSSVM的時序預測MATLAB實戰的圖5

(6)最終求解得到:

基于PSO優化LSSVM的時序預測MATLAB實戰的圖6

二、代碼實戰

%% 文件說明

% main.m   : 主文件,進行預測,將生成的網絡保存到 'nets.mat'中

% main_back.m : 使用'nets.mat'重現結果

% nets.mat : 保存 3 * 48 個grnn網絡,用于結果重現

% QLD1.csv : 原始數據(用的什么時候的數據你點開看一下就明白了)

% QLD1.mat : 導成matlab格式的數據

% adaboost : 組合算法, 輸出結果的第一個數是組合后的mape

%% 原理

% 輸入前一個周7個相同時間點的數據 得到本周7個相同時間點的數據

% 不用執行本文件,運行`main_back.m`即可看到結果

% net1MeanMape =

%    0.0165        <- grnn1

% net2MeanMape =

%    0.0168        <- grnn2

% net3MeanMape =

%    0.0168        <- grnn3

% combineMeanMapes =

%    0.0157        <- adaboost

clc;

close;

clear;

testWeekNum  = 1;

%% 訓練數據周數

trainWeekNum = 228;

load QLD1;

QLD1 = reshape(QLD1, 48, length(QLD1)/48);

testWeekInd  = 1;

trainWeekInd = 1 + (1:trainWeekNum);

testWeekX = [];

testWeekY = [];

for yWeekInd = testWeekInd

    yWeekDayInd = (yWeekInd*7-6):(yWeekInd*7);

    xWeekDayStart = yWeekInd * 7 + 1;

    xWeekDayEnd = (yWeekInd + 1) * 7;

    xWeekDayInd = xWeekDayStart:xWeekDayEnd;

    yDayData = QLD1(:, yWeekDayInd);

    xDayData = QLD1(:, xWeekDayInd);    

    testWeekY = [testWeekY yDayData'];

    testWeekX = [testWeekX xDayData'];

end

trainWeekX = [];

trainWeekY = [];

for yWeekInd = trainWeekInd

    yWeekDayInd = (yWeekInd*7-6):(yWeekInd*7);

    xWeekDayStart = yWeekInd * 7 + 1;

    xWeekDayEnd = (yWeekInd + 1) * 7;

    xWeekDayInd = xWeekDayStart:xWeekDayEnd;

    yDayData = QLD1(:, yWeekDayInd);

    xDayData = QLD1(:, xWeekDayInd);    

    trainWeekY = [trainWeekY yDayData'];

    trainWeekX = [trainWeekX xDayData'];

end

nets = {};

netMapes = [];

for time = 1:48

    disp([' time:', num2str(time)]);

    testInd  = (0:(testWeekNum-1))  * 48 + time;

    trainInd = (0:(trainWeekNum-1)) * 48 + time;

    global trainX trainY xmap ymap testX testY;

    testX  = testWeekX(:, testInd);

    testY  = testWeekY(:, testInd);

    trainX = trainWeekX(:,trainInd);

    trainY = trainWeekY(:,trainInd);

    [trainX, xmap] = mapminmax(trainX, 0.0000001, 1);

    [trainY, ymap] = mapminmax(trainY, 0.0000001, 1);

    testX = mapminmax('apply', testX, xmap);

    [bestGam, bestSig2] = optimizeLSSVM();

    rand('seed', 2);

    net = initlssvm(trainX', trainY', 'function estimation', bestGam, bestSig2, 'RBF_kernel');

    net = trainlssvm(net);

    ySim = simlssvm(net, testX')';

    ySim = mapminmax('reverse', ySim, ymap);

    mape_ = mape(testY, ySim);

    nets{time, 1} = net;

    netMapes = [netMapes mape_];

end

meanMape = mean(netMapes)

save nets nets;

%% 48 7 -> 7

clc;

close;

clear;

testWeekNum  = 1;  

trainWeekNum = 228;

load QLD1;

load nets;

QLD1 = reshape(QLD1, 48, length(QLD1)/48);

netMapes = [];

testWeekInd  = 1;

trainWeekInd = 1 + (1:trainWeekNum);

testWeekX = [];

testWeekY = [];

for yWeekInd = testWeekInd

    yWeekDayInd = (yWeekInd*7-6):(yWeekInd*7);

    xWeekDayStart = yWeekInd * 7 + 1;

    xWeekDayEnd = (yWeekInd + 1) * 7;

    xWeekDayInd = xWeekDayStart:xWeekDayEnd;

    yDayData = QLD1(:, yWeekDayInd);

    xDayData = QLD1(:, xWeekDayInd);    

    testWeekY = [testWeekY yDayData'];

    testWeekX = [testWeekX xDayData'];

end

trainWeekX = [];

trainWeekY = [];

for yWeekInd = trainWeekInd

    yWeekDayInd = (yWeekInd*7-6):(yWeekInd*7);

    xWeekDayStart = yWeekInd * 7 + 1;

    xWeekDayEnd = (yWeekInd + 1) * 7;

    xWeekDayInd = xWeekDayStart:xWeekDayEnd;

    yDayData = QLD1(:, yWeekDayInd);

    xDayData = QLD1(:, xWeekDayInd);    

    trainWeekY = [trainWeekY yDayData'];

    trainWeekX = [trainWeekX xDayData'];

end

for time = 1:48

    disp([' time:', num2str(time)]);

    testInd  = (0:(testWeekNum-1))  * 48 + time;

    trainInd = (0:(trainWeekNum-1)) * 48 + time;

    global trainX trainY xmap ymap testX testY;

    testX  = testWeekX(:, testInd);

    testY  = testWeekY(:, testInd);

    trainX = trainWeekX(:,trainInd);

    trainY = trainWeekY(:,trainInd);

    [trainX, xmap] = mapminmax(trainX, 0.0000001, 1);

    [trainY, ymap] = mapminmax(trainY, 0.0000001, 1);

    testX = mapminmax('apply', testX, xmap);

    net = nets{time, 1};

    ySim = simlssvm(net, testX')';

    ySim = mapminmax('reverse', ySim, ymap);

    mape_ = mape(testY, ySim);

    netMapes = [netMapes mape_];

end  % end time

meanMape = mean(netMapes)

figure(1)

plot(ySim,'r');

hold on 

plot(testY,'b');


結果顯示

基于PSO優化LSSVM的時序預測MATLAB實戰的圖7

文章來源:matlab學習之家

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

1