一、遺傳算法優化VMD參數簡介
1 變分模态分解
VMD分解算法實際上是一個變分問題的求解過程, 它是将原信号分解為K個模态函數uk (t) , 使得每個模态函數的估計帶寬之和最小, 則相應的限制變分模型可表達為
式中:{uk}={u1, …, uk}表示的是分解得到的K個子模态;{wk}={w1, …, wk}表示的是各分量的頻率中心。為了将上述限制性變分問題轉變為非限制性變分問題, 引入二次懲罰項因子α和拉格朗日乘子λ (t) , 則擴充的拉格朗日表達式為
式中:α為懲罰參數;λ為拉格朗日乘子。采用乘法算子交替方向法 (Alternate direction method of multipliers, ADMM) [10]解決變分問題, 通過疊代更新ukn+1、wkn+1以及λn+1得到上述函數的最優解。ukn+1的取值問題可表達為
利用Parseval傅立葉等距變換, 上式可變為
2) 根據式 (4) 、式 (5) 在頻域内更新uk、wk;
- 更新λ, 其中
-
2 遺傳算法VMD參數優化
利用VMD算法進行信号分解時需要設定參數, 研究發現在進行分解時, 模态數K和懲罰參數α對分解的結果影響較大。實際擷取的信号是複雜多變的, 模态數K和懲罰參數α難以确定, 是以選擇合适的參數組合是利用VMD算法進行信号分解的關鍵。
如果設定一個參數不變, 優化另一個參數, 通過這種方式讨論對去噪效果的影響, 就忽略了兩個參數互相作用的結果, 陷入局部優化的僵局。遺傳算法 (GA) 是一種智能優化算法, 具有較強的全局非線性優化能力[12], 是以引入遺傳算法, 借助于适應度函數對目标函數在解空間進行全局并行随機搜尋, 快速準确地擷取優化參數。
利用遺傳算法求解優化問題時, 主要需要經過6個步驟, 編碼、初始群體生成、适應度值評價檢測、選擇、交叉、變異, 使得種群進化為新一代更好适應性的種群。圖1是建立适應度函數的優化結果。
二、部分源代碼
%% 基于遺傳算法(genetic algorithm, GA))優化變分模态分解(variational mode decomposition,VMD)參數
clc
clear
close all
addpath('toolf')
warning off
% 讀取資料
[file,path,indx] = uigetfile({'*.xlsx';'*.xls';'*.txt';'*.*'},'File Selector');
if indx == 1||indx==2
data=xlsread(strcat(path, file));
elseif indx == 3
data=load(strcat(path, file));
else
disp('請選擇資料集進行實驗');
return;
end
%采樣頻率
fs=12800;
% 讀取前1000長度的信号
len=1000;
s=data(1:len);
% 采樣時間
t = (0:len-1)/fs;
%% 設定遺傳算法參數
popsize =8; % 種群大小
iter =30; % 最大疊代次數
dim = 2; % 變量個數
lb = [100 3]; % alpha範圍 K範圍 下限
ub = [2000 7]; % 上限
pc=0.8; %交叉機率,0和1之間
pm=0.2; %變異機率,0和1之間
%% 遺傳算法GA優化VMD參數
tic , % 開始計時
GA_VMD(popsize,iter,dim,lb,ub,pc,pm,0); % 0表示不儲存IMF,1,導出IMF并儲存
toc, % 結束計時
function ret = Cross(pcross, lenchrom, chrom, sizepop, bound)
for i = 1:sizepop
pick = rand(1, 2);
while prod(pick) == 0
pick = rand(1, 2);
end
index = ceil(pick .* sizepop);
pick = rand;
while pick == 0
pick = rand;
end
if pick > pcross
continue;
end
flag = 0;
while flag == 0
pick = rand;
while pick == 0
pick = rand;
end
pos = ceil(pick .* sum(lenchrom));
pick = rand;
v1 = chrom(index(1), pos);
v2 = chrom(index(2), pos);
chrom(index(1), pos) = pick * v2 + (1 - pick) * v1;
chrom(index(2), pos) = pick * v1 + (1 - pick) * v2;
flag1 = test(lenchrom, bound, chrom(index(1), :));
flag2 = test(lenchrom, bound, chrom(index(2), :));
if flag1 * flag2 == 0
flag = 0;
else
flag = 1;
end
end
end
ret = chrom;
end
function ret = Mutation(pmutation, lenchrom, chrom, sizepop, pop, bound)
for i = 1:sizepop
pick = rand;
while pick == 0
pick = rand;
end
index = ceil(pick * sizepop);
pick = rand;
if pick > pmutation
continue;
end
flag = 0;
while flag == 0
pick = rand;
while pick == 0
pick = rand;
end
pos = ceil(pick * sum(lenchrom));
v = chrom(i, pos);
v1 = v - bound(pos, 1);
v2 = bound(pos, 2) - v;
pick = rand;
if pick > 0.5
delta = v2 * (1 - pick^((1 - pop(1) / pop(2))^2));
chrom(i, pos) = v + delta;
else
delta = v1 * (1 - pick^((1 - pop(1) / pop(2))^2));
chrom(i, pos) = v - delta;
end
flag = test(lenchrom, bound, chrom(i, :));
end
end
ret = chrom;