|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
( Z' w. ]6 a' Z0 h2 w
NSGA2算法特征选择MATLAB实现(多目标)
. {: W% P. Y6 v* W
. R' X: r. @( C- l! I+ y9 M2 U8 J L
. \" z9 S' `( y" I' T利用nsga2进行进行特征选择其主要思想是:将子集的选择看作是一个搜索寻优问题(wrapper方法),生成不同的组合,对组合进行评价,再与其他的组合进行比较。这样就将子集的选择看作是一个是一个优化问题。, r8 I1 N" r! e P% _
; x) U0 e' L0 R8 q2 H4 C0 x需要优化的两个目标为特征数和精度。* Q2 F/ J) R" @5 k
9 m; B) r! q- [- [6 [; Wnsga2是一个多目标优化算法。. L* M4 i6 @4 Y M2 m ^8 A
; k" `! ` g2 n4 r
具体的nsga2通用算法请看:NSGA2算法MATLAB实现(能够自定义优化函数)
) l) Y& S& v/ M/ F3 `5 O! ~ \; j/ `/ f+ A/ X! E* O
具体的特征选择代码在上述代码的基础上改了两个①主函数②评价函数,增加了一个数据分成训练集和测试集的函数:
. K$ n, p" Y) U: h8 g" K' M: _2 B7 R* A$ P5 K3 N8 e9 Y) r
- function divide_datasets()
- load Parkinson.mat;
- dataMat=Parkinson_f;
- len=size(dataMat,1);
- %归一化
- maxV = max(dataMat);
- minV = min(dataMat);
- range = maxV-minV;
- newdataMat = (dataMat-repmat(minV,[len,1]))./(repmat(range,[len,1]));
- Indices = crossvalind('Kfold', length(Parkinson_label), 10);
- site = find(Indices==1|Indices==2|Indices==3);
- train_F = newdataMat(site,:);
- train_L = Parkinson_label(site);
- site2 = find(Indices~=1&Indices~=2&Indices~=3);
- test_F = newdataMat(site2,:);
- test_L =Parkinson_label(site2);
- save train_F train_F;
- save train_L train_L;
- save test_F test_F;
- save test_L test_L;
- end
- %what doesn't kill you makes you stronger, stand a little taller,doesn't mean i'm over cause you're gonw.
6 T; z) L2 x0 m4 L9 H
/ {) Y0 O0 g7 H( r: q; X
6 K9 e# x ^5 xMATLAB代码主函数:0 [' A( J0 K6 V- H$ W% G
$ q! W8 M# U, t- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %此处可以更改
- %更多机器学习内容请访问omegaxyz.com
- clc;
- clear;
- pop = 500; %种群数量
- gen = 100; %迭代次数
- M = 2; %目标数量
- V = 22; %维度
- min_range = zeros(1, V); %下界
- max_range = ones(1,V); %上界
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %特征选择
- divide_datasets();
- global answer
- answer=cell(M,3);
- global choice %选出的特征个数
- choice=0.8;
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- chromosome = initialize_variables(pop, M, V, min_range, max_range);
- chromosome = non_domination_sort_mod(chromosome, M, V);
- for i = 1 : gen
- pool = round(pop/2);
- tour = 2;
- parent_chromosome = tournament_selection(chromosome, pool, tour);
- mu = 20;
- mum = 20;
- offspring_chromosome = genetic_operator(parent_chromosome,M, V, mu, mum, min_range, max_range);
- [main_pop,~] = size(chromosome);
- [offspring_pop,~] = size(offspring_chromosome);
- clear temp
- intermediate_chromosome(1:main_pop,:) = chromosome;
- intermediate_chromosome(main_pop + 1 : main_pop + offspring_pop,1 : M+V) = offspring_chromosome;
- intermediate_chromosome = non_domination_sort_mod(intermediate_chromosome, M, V);
- chromosome = replace_chromosome(intermediate_chromosome, M, V, pop);
- if ~mod(i,100)
- clc;
- fprintf('%d generations completed\n',i);
- end
- end
- if M == 2
- plot(chromosome(:,V + 1),chromosome(:,V + 2),'*');
- xlabel('f_1'); ylabel('f_2');
- title('Pareto Optimal Front');
- elseif M == 3
- plot3(chromosome(:,V + 1),chromosome(:,V + 2),chromosome(:,V + 3),'*');
- xlabel('f_1'); ylabel('f_2'); zlabel('f_3');
- title('Pareto Optimal SuRFace');
- end
; i6 H" |( z8 G# O
s' a+ Z% J: {9 X. r5 r评价函数(利用林志仁SVM进行训练):7 G5 U n) O/ b' v& A6 Z
( P8 r: ^5 R" o4 |$ S# Y* j. A, G
- function f = evaluate_objective(x, M, V, i)
- f = [];
- global answer
- global choice
- load train_F.mat;
- load train_L.mat;
- load test_F.mat;
- load test_L.mat;
- temp_x = x(1:V);
- inmodel = temp_x>choice;%%%%%设定恰当的阈值选择特征
- f(1) = sum(inmodel(1,:));
- answer(i,1)={f(1)};
- model = libsvmtrain(train_L,train_F(:,inmodel), '-s 0 -t 2 -c 1.2 -g 2.8');
- [predict_label, ~, ~] = libsvmpredict(test_L,test_F(:,inmodel),model,'-q');
- error=0;
- for j=1:length(test_L)
- if(predict_label(j,1) ~= test_L(j,1))
- error = error+1;
- end
- end
- error = error/length(test_L);
- f(2) = error;
- answer(i,2)={error};
- answer(i,3)={inmodel};
- end S A( s; b! K3 E% g' T
& [; `9 W v! `6 V4 h选的的数据集请从UCI上下载。9 q) V" A9 A6 j4 k9 X
- ~( Y. x6 a1 x* q' \# t* x
结果:1 a x7 V2 y" ]) h% x0 R. [
) I" [6 { [' r4 H4 h①pareto面
( e. Z; B; F _$ U8 O4 r& R# [, E/ D% O. `. K' D T
/ t9 k. _4 }) H" T$ d9 x3 }% [' c E) T, w5 x) ^. D) |
最后粒子的数据(选出的特征数和精确度)' R3 i4 @/ w4 @2 U
" p* j" B/ [( P0 I. |. C
# L- u( z4 h7 g+ @; }! Q4 [
0 o, b% Y0 Q7 K9 T8 V! D0 B& h z* f5 y/ c b) s8 S% O2 r
|
|