【SVM回归预测】基于matlab布谷鸟搜索算法优化SVM回归预测【含Matlab源码 1525期】
一、布谷鳥算法簡介
布谷鳥算法,英文叫做Cuckoo search (CS algorithm)。首先還是同樣,介紹一下這個算法的英文含義, Cuckoo是布谷鳥的意思,啥是布谷鳥呢,是一種叫做布谷的鳥,o(∩_∩)o ,這種鳥她媽很懶,自己生蛋自己不養,一般把它的寶寶扔到別的種類鳥的鳥巢去。但是呢,當孵化后,遇到聰明的鳥媽媽,一看就知道不是親生的,直接就被鳥媽媽給殺了。于是這群布谷鳥寶寶為了保命,它們就模仿別的種類的鳥叫,讓智商或者情商極低的鳥媽媽誤認為是自己的親寶寶,這樣它就活下來了。
布谷鳥搜索算法(Cuckoo Search, CS)是2009年Xin-She Yang 與Suash Deb在《Cuckoo Search via Levy Flights》一文中提出的一種優化算法。布谷鳥算法是一種集合了布谷鳥巢寄生性和萊維飛行(Levy Flights)模式的群體智能搜索技術,通過隨機游走的方式搜索得到一個最優的鳥巢來孵化自己的鳥蛋。這種方式可以達到一種高效的尋優模式。
1 布谷鳥的巢寄生性
2 萊維飛行
圖1.模擬萊維飛行軌跡示意圖
3 布谷鳥搜索算法的實現過程
二、部分源代碼
clear; clc; close all; %% 數據導入 data = csvread ('輸入輸出數據集/VMD_Brent_Total.csv'); IMF = data(:,14); %% 劃分訓練集和測試集 x = 5; % sliding window length z = 1; % output length [train_input,train_output,test_input,test_output] = Split(IMF,x,z); % 默認按照 8:2 的比例劃分訓練集和測試集 %% 預處理 %歸一化%% CS-SVR time= 50; n=20; % n為巢穴數量 pa=0.20; % 被宿主發現的概率 dim = 2; % 需要尋優的參數個數% 隨機初始化巢穴 nest=zeros(n,dim); for i=1:n % 遍歷每個巢穴nest(i,:)=Lb+(Ub-Lb).*rand(size(Lb)); % 對每個巢穴,隨機初始化參數 endfitness=ones(1,n); % 目標函數值初始化 [fmin,bestnest,nest,fitness]=get_best_nest(nest,nest,fitness,input_train,output_train,input_test,output_test); % 找出當前最佳巢穴和參數%% 迭代開始 for t=1:timenew_nest=get_cuckoos(nest,bestnest,Lb,Ub); % 保留當前最優解,尋找新巢穴[~,~,nest,fitness]=get_best_nest(nest,new_nest,fitness,input_train,output_train,inpu% 找出當前最佳巢穴和參數[fnew,best,nest,fitness]=get_best_nest(nest,new_nest,fitness,input_train,output_train,input_test,output_test); if fnew<fminfmin=fnew;bestnest=best ;end end %% 打印參數選擇結果 bestobjfun=fmin; bestc=bestnest(1); bestg=bestnest(2); disp('打印參數選擇結果'); str=sprintf('Best c = %g,Best g = %g',bestc,bestg); disp(str)%% 利用回歸預測分析最佳的參數進行SVM網絡訓練 cmd_cs_svr=['-s 3 -t 2',' -c ',num2str(bestnest(1)),' -g ',num2str(bestnest(2))]; model_cs_svr = svmtrain(output_train',input_train',cmd_cs_svr); % SVM模型訓練%% SVM網絡回歸預測 [output_test_pre,acc,decision_values]=svmpredict(output_test',input_test',model_cs_svr); % SVM模型預測及其精度 test_pre=mapminmax('reverse',output_test_pre',rule2); test_pre = test_pre';figure('Name','原始-預測圖') plot(test_pre,'r-');hold on;plot((test_output),'b-'); legend('預測','原始') set(gcf,'unit','centimeters','position',[15,13,20,13])result=[test_output',test_pre];MAE = mymae(test_output',test_pre) MSE = mymse(test_output',test_pre) MAPE = mymape(test_output',test_pre) %% 顯示程序運行時間 % toc function [bestsol,fval]=cuckoo_ori_with_chinese_note(time) % 由CS算法源碼添加中文注釋,Genlovy Hoo,2016.09.05clear clc close all format longif nargin<1% Number of iteraions 迭代次數time=2000; enddisp('Computing ... it may take a few minutes.');% Number of nests (or different solutions) n=25; % n為巢穴數量 % Discovery rate of alien eggs/solutions pa=0.25; % 被宿主發現的概率% Simple bounds of the search domain % Lower bounds and upper bounds dim = 3; % 需要尋優的參數個數 Lb=[0.05,0.25,2.0]; % 設置參數下界 Ub=[2.0,1.3,15.0]; % 設置參數上界% Random initial solutions nest=zeros(n,dim); for i=1:n % 遍歷每個巢穴 nest(i,:)=Lb+(Ub-Lb).*rand(size(Lb)); % 對每個巢穴,隨機初始化參數 end% Get the current best fitness=10^10*ones(n,1); % 目標函數值初始化 [fmin,bestnest,nest,fitness]=get_best_nest(nest,nest,fitness); % 找出當前最佳巢穴和參數N_iter=0; % 迭代計數器 %% Starting iterations for t=1:time% Generate new solutions (but keep the current best)new_nest=get_cuckoos(nest,bestnest,Lb,Ub); % 保留當前最優解,尋找新巢穴[fnew,best,nest,fitness]=get_best_nest(nest,new_nest,fitness); % 找出當前最佳巢穴和參數% Update the counterN_iter=N_iter+n; % 更新計數器% Discovery and randomizationnew_nest=empty_nests(nest,Lb,Ub,pa); % 發現并更新劣質巢穴% Evaluate this solution[fnew,best,nest,fitness]=get_best_nest(nest,new_nest,fitness); % 找出當前最佳巢穴和參數% Update the counter againN_iter=N_iter+n; % 更新計數器end %% End of iterations%% Post-optimization processing %% Display all the nests disp(strcat('Total number of iterations=',num2str(N_iter))); fmin bestnest%% --------------- All subfunctions are list below ------------------ %% Get cuckoos by ramdom walk 通過隨機游走搜尋鳥巢 function nest=get_cuckoos(nest,best,Lb,Ub) % Levy flights n=size(nest,1); % 鳥巢個數 % Levy exponent and coefficient % For details, see equation (2.21), Page 16 (chapter 2) of the book % X. S. Yang, Nature-Inspired Metaheuristic Algorithms, 2nd Edition, Luniver Press, (2010).% Levy flights參數準備 beta=3/2; sigma=(gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta); % gamma(x)求gamma函數值for j=1:n % 遍歷每個巢穴s=nest(j,:); % 提取當前巢穴的參數% This is a simple way of implementing Levy flights% For standard random walks, use step=1;%% Levy flights by Mantegna's algorithmu=randn(size(s))*sigma; % 生成服從 N(0,sigma^2) 的隨機數u,u為長度為參數個數的向量v=randn(size(s)); % 生成服從 N(0,1) 的隨機數v向量step=u./abs(v).^(1/beta); % 計算步長% In the next equation, the difference factor (s-best) means that % when the solution is the best solution, it remains unchanged. stepsize=0.01*step.*(s-best); % 巢穴位置變化量,如當前巢穴為最優解,則變化量將為0% Here the factor 0.01 comes from the fact that L/100 should the typical% step size of walks/flights where L is the typical lenghtscale; % otherwise, Levy flights may become too aggresive/efficient, % which makes new solutions (even) jump out side of the design domain % (and thus wasting evaluations).% Now the actual random walks or flightss=s+stepsize.*randn(size(s)); % 步長調整% Apply simple bounds/limitsnest(j,:)=simplebounds(s,Lb,Ub); % 更新巢穴 end三、運行結果
四、matlab版本及參考文獻
1 matlab版本
2014a
2 參考文獻
[1] 包子陽,余繼周,楊杉.智能優化算法及其MATLAB實例(第2版)[M].電子工業出版社,2016.
[2]張巖,吳水根.MATLAB優化算法源代碼[M].清華大學出版社,2017.
[3]周品.MATLAB 神經網絡設計與應用[M].清華大學出版社,2013.
[4]陳明.MATLAB神經網絡原理與實例精解[M].清華大學出版社,2013.
[5]方清城.MATLAB R2016a神經網絡設計與應用28個案例分析[M].清華大學出版社,2018.
總結
以上是生活随笔為你收集整理的【SVM回归预测】基于matlab布谷鸟搜索算法优化SVM回归预测【含Matlab源码 1525期】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个快播倒下去,千千万万个快播站起来
- 下一篇: 多目标布谷鸟(MOCS)优化算法附Mat