DE(差分進化)優化演算法MATLAB原始碼詳細中文註解
以優化SVR演算法的引數c和g為例,對DE(差分進化)演算法MATLAB原始碼進行了詳細中文註解。
完整程式和示例檔案地址:http://download.csdn.net/detail/u013337691/9671714
百度雲連結: http://pan.baidu.com/s/1dEYAHS9 密碼: 6xw5
function [bestc,bestg,test_pre]=my_DE_SVR(para,input_train,output_train,input_test,output_test)
% 引數向量 parameters [n,N_iteration,beta_min,beta_max,pCR]
% n為種群規模,N_iteration為迭代次數
% beta_min 縮放因子下界 Lower Bound of Scaling Factor
% beta_max=0.8; % 縮放因子上界 Upper Bound of Scaling Factor
% pCR 交叉概率 Crossover Probability
% 要求輸入資料為列向量(矩陣)
%% 資料歸一化
[input_train,rule1]=mapminmax(input_train');
[output_train,rule2]=mapminmax(output_train');
input_test=mapminmax('apply',input_test',rule1);
output_test=mapminmax('apply',output_test',rule2);
input_train=input_train';
output_train=output_train';
input_test=input_test';
output_test=output_test';
%% 利用差分進化(DE)演算法選擇最佳的SVR引數
nPop=para(1); % 種群規模 Population Size
MaxIt=para(2); % 最大迭代次數Maximum Number of Iterations
nVar=2; % 自變數維數,此例需要優化兩個引數c和g Number of Decision Variables
VarSize=[1,nVar]; % 決策變數矩陣大小 Decision Variables Matrix Size
beta_min=para(3); % 縮放因子下界 Lower Bound of Scaling Factor
beta_max=para(4); % 縮放因子上界 Upper Bound of Scaling Factor
pCR=para(5); % 交叉概率 Crossover Probability
lb=[0.01,0.01]; % 引數取值下界
ub=[100,100]; % 引數取值上界
%% 初始化 Initialization
empty_individual.Position=[]; % 種群初始化
empty_individual.Cost=[]; % 種群目標函式值初始化
BestSol.Cost=inf; % 最優值初始化
pop=repmat(empty_individual,nPop,1); % 將儲存種群資訊的結構體擴充套件為結構體矩陣,行數等於種群大小
for i=1:nPop % 遍歷每個個體
pop(i).Position=init_individual(lb,ub,nVar,1); % 隨機初始化個體
pop(i).Cost=fobj(pop(i).Position,input_train,output_train,input_test,output_test); % 計算個體目標函式值
if pop(i).Cost<BestSol.Cost % 如果個體目標函式值優於當前最優值
BestSol=pop(i); % 更新最優值
end
end
BestCost=zeros(MaxIt,1); % 初始化迭代最優值
%% 主迴圈 DE Main Loop
for it=1:MaxIt
for i=1:nPop % 遍歷每個個體
x=pop(i).Position; % 提取個體位置
% 隨機選擇三個個體以備變異使用
A=randperm(nPop); % 個體順序重新隨機排列
A(A==i)=[]; % 當前個體所排位置騰空(產生變異中間體時當前個體不參與)
a=A(1);
b=A(2);
c=A(3);
% 變異操作 Mutation
beta=unifrnd(beta_min,beta_max,VarSize); % 隨機產生縮放因子
y=pop(a).Position+beta.*(pop(b).Position-pop(c).Position); % 產生中間體
% 防止中間體越界
y=max(y,lb);
y=min(y,ub);
% 交叉操作 Crossover
z=zeros(size(x)); % 初始化一個新個體
j0=randi([1,numel(x)]); % 產生一個偽隨機數,即選取待交換維度編號???
for j=1:numel(x) % 遍歷每個維度
if j==j0 || rand<=pCR % 如果當前維度是待交換維度或者隨機概率小於交叉概率
z(j)=y(j); % 新個體當前維度值等於中間體對應維度值
else
z(j)=x(j); % 新個體當前維度值等於當前個體對應維度值
end
end
NewSol.Position=z; % 交叉操作之後得到新個體
NewSol.Cost=fobj(NewSol.Position,input_train,output_train,input_test,output_test); % 新個體目標函式值
if NewSol.Cost<pop(i).Cost % 如果新個體優於當前個體
pop(i)=NewSol; % 更新當前個體
if pop(i).Cost<BestSol.Cost % 如果當前個體(更新後的)優於最優個體
BestSol=pop(i); % 更新最優個體
end
end
end
% 儲存當前迭代最優個體函式值 Update Best Cost
BestCost(it)=BestSol.Cost;
end
bestc=BestSol.Position(1,1);
bestg=BestSol.Position(1,2);
%% 圖示尋優過程
plot(BestCost);
xlabel('Iteration');
ylabel('Best Val');
grid on;
%% 利用迴歸預測分析最佳的引數進行SVM網路訓練
cmd_cs_svr=['-s 3 -t 2',' -c ',num2str(bestc),' -g ',num2str(bestg)];
model_cs_svr=svmtrain(output_train,input_train,cmd_cs_svr); % SVM模型訓練
%% SVM網路迴歸預測
[output_test_pre,~]=svmpredict(output_test,input_test,model_cs_svr); % SVM模型預測及其精度
test_pre=mapminmax('reverse',output_test_pre',rule2);
test_pre = test_pre';
%% SVR_fitness -- objective function
function fitness=fobj(cv,input_train,output_train,input_test,output_test)
% cv為長度為2的橫向量,即SVR中引數c和v的值
cmd = ['-s 3 -t 2',' -c ',num2str(cv(1)),' -g ',num2str(cv(2))];
model=svmtrain(output_train,input_train,cmd); % SVM模型訓練
[~,fitness]=svmpredict(output_test,input_test,model); % SVM模型預測及其精度
fitness=fitness(2); % 以平均均方誤差MSE作為優化的目標函式值
function x=init_individual(xlb,xub,dim,sizepop)
% 引數初始化函式
% lb:引數下界,行向量
% ub:引數上界,行向量
% dim:引數維度
% sizepop 種群規模
% x:返回sizepop*size(lb,2)的引數矩陣
xRange=repmat((xub-xlb),[sizepop,1]);
xLower=repmat(xlb,[sizepop,1]);
x=rand(sizepop,dim).*xRange+xLower;
clear
clc
close all
load wndspd % 示例資料為風速(時間序列)資料,共144個樣本
%% PSO-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,200,0.2,0.8,0.2];
[bestc,bestg,test_pre]=my_DE_SVR(para,input_train',output_train',input_test',output_test');
% 預測誤差計算
MSE=mymse(output_test',test_pre)
MAE=mymae(output_test',test_pre)
MAPE=mymape(output_test',test_pre)
FVD=myfvd(output_test',test_pre)
CDFR=mycdfr(output_test',test_pre)
%% 預測結果圖
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('預測','原始',0)
set(gcf,'unit','centimeters','position',[0.5,13,30,5])
toc
本文參考:http://cn.mathworks.com/matlabcentral/fileexchange/52897-differential-evolution–de-?s_tid=srchtitle
(廣告)歡迎掃描關注微信公眾號:Genlovhyy的資料小站(Gnelovy212)
相關文章
- 差分進化演算法介紹及matlab實現演算法Matlab
- hanlp原始碼解析之中文分詞演算法詳解HanLP原始碼中文分詞演算法
- petite-vue原始碼剖析-優化手段template詳解Vue原始碼優化
- lucene、lucene.NET詳細使用與優化詳解優化
- 超詳細的 Bert 文字分類原始碼解讀 | 附原始碼文字分類原始碼
- Tarjan演算法及其應用 總結+詳細講解+詳細程式碼註釋演算法
- Android註解使用之使用Support Annotations註解優化程式碼Android優化
- 基礎排序演算法詳解與優化排序演算法優化
- 效能優化詳解優化
- Nginx 優化指南 絕對詳細Nginx優化
- Bootstrap的Model原始碼詳細註釋 (轉)boot原始碼
- sqlHelper類的中文 詳細註釋SQL
- EventBus原始碼解讀詳細註釋(1)register的幕後黑手原始碼
- VS Code使用Git視覺化管理原始碼詳細教程Git視覺化原始碼
- 粒子群優化演算法對BP神經網路優化 Matlab實現優化演算法神經網路Matlab
- MSSQL資料批量插入優化詳細SQL優化
- MongoDB索引優化詳解MongoDB索引優化
- Elasticsearch效能優化引數註解Elasticsearch優化
- 中文分詞演算法工具hanlp原始碼解析中文分詞演算法HanLP原始碼
- 帶你詳細解讀十條關於SQL效能優化!SQL優化
- 透過MATLAB分別對比二進位制編碼遺傳最佳化演算法和實數編碼遺傳最佳化演算法Matlab演算法
- MongoDB索引與優化詳解MongoDB索引優化
- Linux核心優化詳解Linux優化
- SSL/TLS 握手優化詳解TLS優化
- Myers差分演算法的理解、實現、視覺化演算法視覺化
- SQL優化:limit分頁優化SQL優化MIT
- EventBus原始碼解讀詳細註釋(2)MainThread執行緒模型分析原始碼AIthread執行緒模型
- Python實現快遞分揀小程式(附原始碼和超詳細註釋)Python原始碼
- MATLAB實戰系列(十一)-多種群遺傳演算法的函式優化演算法(附MATLAB程式碼)Matlab演算法函式優化
- MySQL配置檔案my.cnf引數優化和中文詳解MySql優化
- ASO積分牆優化,差點毀了我家產品優化
- Spring 註解學習 詳細程式碼示例Spring
- Java註解最全詳解(超級詳細)Java
- Linux系統優化部分核心引數調優中文註釋Linux優化
- 詳細瞭解SQL Server 2008效能和效能優化SQLServer優化
- Vue 原始碼解讀(9)—— 編譯器 之 優化Vue原始碼編譯優化
- Android效能優化篇:從程式碼角度進行優化Android優化
- Android原始碼分析–ArrayMap優化Android原始碼優化