【SVR預測】基於差分進化改進灰狼演算法優化SVR預測matlab原始碼
一、灰狼演算法
1.1 背景介紹
灰狼優化演算法(Grey Wolf Optimizer,GWO)由澳大利亞格里菲斯大學學者 Mirjalili 等人於2014年提出來的一種群智慧優化演算法。該演算法受到了灰狼捕食獵物活動的啟發而開發的一種優化搜尋方法,它具有較強的收斂效能、引數少、易實現等特點。近年來受到了學者的廣泛關注,它己被成功地應用到了車間排程、引數優化、影象分類等領域中。
1.2 演算法原理
狼群中有α、β、γ三隻狼做頭狼,其中α是狼王,β、γ分別排第二、第三,β、γ都要聽α的,γ要聽β的。這三匹狼指導者其他的狼尋找獵物。狼群尋找獵物的過程就是我們尋找最優解的過程。
GWO具體優化過程包含了社會等級分層、跟蹤、包圍和攻擊獵物和尋找獵物。
但其核心行為只有捕獵。
為了模擬灰狼的搜尋行為,假設α、β、γ具有較強識別潛在獵物的能力,因此,在每次迭代過程中,保留當前種群中最好的三隻狼(α、β、γ),然後根據他們的位置資訊來更新其他搜尋代理的位置。
1.3 構建演算法數學模型
1)社會等級分層
GWO的優化過程主要有每代種群中的最好三匹狼(具體構建時表示為三個最好的解)來指導完成。
2)包圍獵物
灰狼捜索獵物時會逐漸地接近獵物幷包圍它,該行為的數學模型如下:
二、svr演算法
-
SVR的背景
SVR做為SVM的分支從而被提出,一張圖介紹SVR與SVM的關係
-
SVR的原理
SVR與一般線性迴歸的區別
SVR | 一般線性迴歸 |
---|---|
1.資料在間隔帶內則不計算損失,當且僅當f(x)與y之間的差距的絕對值大於ϵ \epsilonϵ才計算損失 | 1.只要f(x)與y不相等時,就計算損失 |
2.通過最大化間隔帶的寬度與最小化總損失來優化模型 | 2.通過梯度下降之後求均值來優化模型 |
原理:SVR線上性函式兩側製造了一個“間隔帶”,間距為ϵ \epsilonϵ(也叫容忍偏差,是一個由人工設定的經驗值),對所有落入到間隔帶內的樣本不計算損失,也就是隻有支援向量才會對其函式模型產生影響,最後通過最小化總損失和最大化間隔來得出優化後的模型。
注:這裡介紹一下支援向量的含義:直觀解釋,支援向量就是對最終w,b的計算起到作用的樣本(a>0)
如下圖所示, "管道"內樣本對應a=0,為非支援向量;
位於“管壁”上的為邊界支援向量,0<a<ϵ \epsilonϵ
位於"管道"之外的為非邊界支援向量,a>ϵ \epsilonϵ(異常檢測時,常從非邊界支援向量中挑選異常點)
- SVR的數學模型
3.1線性硬間隔SVR
3.2線性軟間隔SVR
原因:在現實任務中,往往很難直接確定合適的ϵ \epsilonϵ,確保大部分資料都能在間隔帶內,而SVR希望所有訓練資料都在間隔帶內,所以加入鬆弛變數ξ \xiξ,從而使函式的間隔要求變的放鬆,也就是允許一些樣本可以不在間隔帶內。
引入鬆弛變數後,這個時候,所有的樣本資料都滿足條件:
這就是映入鬆弛變數後的限制條件,所以也叫-------軟間隔SVR
注:對於任意樣本xi,如果它在隔離帶裡面或者邊緣上,ξ \xiξ都為0;在隔離帶上方則為ξ > 0 , ξ ∗ = 0 \xi>0,\xi^*=0ξ>0,ξ∗=0
在隔離帶下方則為ξ ∗ > 0 , ξ = 0 \xi^*>0,\xi=0ξ∗>0,ξ=0
三、部分程式碼
clear
clc
close all
load wndspd % 示例資料為風速(時間序列)資料,共144個樣本\
addpath('./libsvm-3.1/')
%% HGWO-SVR
% 訓練/測試資料準備(用前3天預測後一天),用前100天做訓練資料
input_train(1,:)=wndspd(1:97);
input_train(2,:)=wndspd(2:98);
input_train(3,:)=wndspd(3:99);
output_train=[wndspd(4:100)]';
input_test(1,:)=wndspd(101:end-3);
input_test(2,:)=wndspd(102:end-2);
input_test(3,:)=wndspd(103:end-1);
output_test=(wndspd(104:end))';
para=[30,500,0.2,0.8,0.2];
[bestc,bestg,test_pre]=my_HGWO_SVR(para,input_train',output_train',input_test',output_test');
%% 預測結果圖
err_pre=output_test'-test_pre;
figure('Name','測試資料殘差圖')
set(gcf,'unit','centimeters','position',[0.5,5,30,5])
plot(err_pre,'*-');
figure('Name','原始-預測圖')
plot(test_pre,'*r-');hold on;plot(output_test,'bo-');
legend('預測','原始')
set(gcf,'unit','centimeters','position',[0.5,13,30,5])
toc
四、模擬結果