EDA365电子论坛网

标题: PSO算法特征选择MATLAB实现(单目标) [打印本页]

作者: uperrua    时间: 2020-5-20 14:26
标题: PSO算法特征选择MATLAB实现(单目标)
本帖最后由 uperrua 于 2020-5-20 14:28 编辑
) s& a8 x( t$ X1 ^2 J. v3 P$ H- h7 l+ ^8 d
PSO进行进行特征选择其主要思想是:将子集的选择看作是一个搜索寻优问题(wrapper方法),生成不同的组合,对组合进行评价,再与其他的组合进行比较。这样就将子集的选择看作是一个是一个优化问题。5 j$ G, L, y7 `4 t) Y
' Q/ L7 s( W" @, u' M, x( O: L

- f9 _. g; M9 c  a6 B% r1 B9 p下面是PSO进行特征选择的代码(注意:整体代码是单目标只优化错误率,注意训练使用的是林志仁SVM,数据集是Parkinson,可以到UCI上下载,训练的结果是错误率)7 S+ L7 @7 S$ @# ?' {% p, ^# m

0 s4 q  f9 _0 L数据集分割为训练集和测试集:0 e! j# i# ?/ \- _/ c1 b3 L9 D/ _
4 D8 P$ A6 |; L( T
function divide_datasets9 c9 K0 A' p+ c! `# U5 E
load Parkinson.mat;
' R: f0 k& Z  f, r1 A5 G! J! sdataMat=Parkinson_f;
& F% v  ^% A  G" S7 \len=size(dataMat,1);
! X4 P% _( ^+ E7 {' k9 w( t  [%归一化
& Y: x- e- {* J$ L- R5 KmaxV = max(dataMat);
0 i0 D+ k/ b& o# Z% V* f2 mminV = min(dataMat);
+ b1 m3 v; N$ o- l/ Jrange = maxV-minV;$ y/ E9 H; z1 z4 s& b9 |
newdataMat = (dataMat-repmat(minV,[len,1]))./(repmat(range,[len,1]));0 f. o9 K/ d6 p8 A2 t$ a
$ q' ^' t- K5 ~. e6 K
Indices   =  crossvalind('Kfold', length(Parkinson_label), 10);; f& ]6 t4 e& L: |! s' |# f
site = find(Indices==1|Indices==2|Indices==3);2 L1 u" i+ U9 l: S# V6 p" t4 J
train_F = newdataMat(site,: );; n3 b  I; p1 c
train_L = Parkinson_label(site);
, h2 a2 T1 i. ?* |1 p2 \site2 = find(Indices~=1&Indices~=2&Indices~=3);6 F3 e  v/ p9 l$ f2 W* J
test_F = newdataMat(site2,: );
$ I3 S) T5 I1 [( @test_L =Parkinson_label(site2);( r# y& W! B, t$ v9 l
save train_F train_F;. S; e. D% q9 l! `# ^$ W5 p% ?' j
save train_L train_L;* W; f7 S- u- z7 \' {$ B: W! p/ \
save test_F test_F;* q0 t4 c% A1 n4 R) Z
save test_L test_L;
! ^7 U# T% a# M$ rend+ z: W. G& }6 [6 t8 o$ }# ?8 v

5 c. w3 E# h! I- L
8 D, B& i6 E* n+ u主函数PSOFS:' u& M0 o8 Q* C! r. h

( Z. b" \% t. w# [. R7 I' Kclear;
  |: E, ^6 Z' @. J, }clc;
3 ^, X" z* G9 ]1 m- `, o8 Lformat long;
2 E6 ]) C. o3 C: L1 g%------给定初始化条件----------------------------------------------, M8 b5 c! G4 P: X+ R2 G1 E4 N/ \3 F8 m
c1=2;             %学习因子1
3 g: k9 ~: k* Oc2=2;             %学习因子29 e$ ^% w; i- D6 s- ]
w=0.7;            %惯性权重; x6 X% p3 b) l. |. {
MaxDT=100;       %最大迭代次数
6 N, H# o& N5 ~3 ED=22;             %搜索空间维数(未知数个数)# J% E& a: l- ]) A1 t' t  U
M=30;             %初始化群体个体数目" l. U( x! e  t# n; O9 U
bound=1;# r$ L, N, {. [3 O
%eps=10^(-6);      %设置精度(在已知最小值时候用)
5 n4 h6 p. C" z; S# B6 L% aglobal answer      %最后所有粒子的结果(包括特征与精确度)
2 ?+ y# S- W; _0 Kanswer=cell(M,3);% \7 r. ]9 @; `* S/ Z
global choice     %选出的特征个数1 b' `. {2 ]0 X- x: b3 X. p" ]1 {
choice=0.8;
" l) a+ N& C- Z* P9 x/ z* \, V4 n9 n8 \$ A1 K, k9 n. h' T: d
%------初始化种群的个体(可以在这里限定位置和速度的范围)------------
" R- z4 l( C( ?( j) Z  p. k- i( s6 q+ g3 G
( u6 `8 X+ l7 K5 s  F: |9 zx=randn(M,D); %随机初始化位置
( H  x( y+ z( G; n3 U) W9 J, Nv=randn(M,D); %随机初始化速度7 S* F* c" ~) m7 R1 ]
x(x>bound)=bound;' E- S  S1 P# s) }8 \$ j% Q# u
x(x<-bound)=-bound;, ]( Q! n7 H5 Y3 q- Y5 C
%------先计算各个粒子的适应度,并初始化p(i)和gbest--------------------& n! N& V" v! A. C6 u6 S# ]
divide_datasets();
: q# i! p6 y6 K/ P. N9 U- d; Nfor i=1:M" r: d, D7 N0 _# T
    p(i)=fitness(x(i,: ),i);
' m* V& ?4 Z& Y$ f" f- o. b    y(i,: )=x(i,: );. y$ [8 Y" q, `
end
: t* l2 q0 k/ D- ?gbest=x(1,: );             %gbest为全局最优/ V! @" t% _" q! k6 O

. C3 b8 O( O; h( ?* I1 q* H, ifor i=2:M0 I% c( y5 N6 {& S' R! L
    if(fitness(x(i,: ),i)<fitness(gbest,i))
1 Y- s' f0 {. Y/ \7 F$ a        gbest=x(i,: );8 H* M5 K! h" i# n
    end
0 Z3 \5 d0 f, [) S# s$ A! Z! `+ b. fend1 v1 d5 C9 _  ?2 E- g. z1 Y/ R
, @5 a1 ^! x7 }) e% O
%------进入主要循环,按照公式依次迭代,直到满足精度要求------------
' r" ?$ r+ }, `9 Wfor t=1:MaxDT
9 e  G' @# Q0 A/ h2 u; @7 t    for i=1:M
# V( \$ r# Q4 k9 P! K        v(i,: )=w*v(i,: )+c1*rand*(y(i,: )-x(i,: ))+c2*rand*(gbest-x(i,: ));/ M- S1 E& j0 _* Z5 z
        x(i,: )=x(i,: )+v(i,: );
1 M+ j: Y4 s* d' Z% X: u# p        if fitness(x(i,: ),D)<p(i)* ]' o2 @; h% y; w. ]
            p(i)=fitness(x(i,: ),i);5 I% R. h1 R$ n0 g4 M' S
            y(i,: )=x(i,: );% E1 k, ]9 M7 v
        end1 o0 G# o% l% [
        if p(i)<fitness(gbest,i)3 e1 u6 W3 K( n, C
            gbest=y(i,: );
8 n. g1 |/ }. }2 I        end
; q0 J- h  ]7 c& ?, f! u    end- y. Z9 ~0 |. n# |. A+ N
end
3 d% |; ~& `9 z. a' L: N0 x5 o2 f0 a0 P
%------显示计算结果
! ]# J# q+ e2 r" d* K, B: b$ Ddisp('*************************************************************')
  ~, ~  n7 N% S( f4 n# jSolution=gbest';' d; D, j% j& [# e; R+ \3 h1 B
Result=fitness(gbest,i);" W; }) @) U' _* @, Y  [* F. k( ]# n
disp('*************************************************************')# x% ?" \  H) |
5 `/ B# C. [6 ]6 I

' _0 z" a& h& T. e  e特征选择评价函数(利用林志仁的SVM进行训练):0 t- x- m& @$ B. ~4 D, b: z8 s2 }

, P- D' z; k( R/ b: h; e% xfunction error = fitness(x,i)
& ?0 `8 l+ `$ ]/ z4 E9 Vglobal answer
! J$ K0 S& z2 t' j6 b* D! xglobal choice
) _3 \, R$ A" v, Y$ k0 g  K" uload train_F.mat;6 n4 Y1 R( \) L7 G: `1 A& J
load train_L.mat;
5 Z& s! o7 h, M1 P( z: yload test_F.mat;; c: f6 A7 g8 ^1 W
load test_L.mat;
$ E* A* b$ q0 t4 w& E
6 H( C% G* D9 d$ `: Pinmodel = x>choice;%%%%%设定恰当的阈值选择特征
8 C. J0 I' _3 @. M; R# m* |. Oanswer(i,1)={sum(inmodel(1,: ))};
" i: \, J$ |. V& `; m3 I! Jmodel = libsvmtrain(train_L,train_F(:,inmodel));
  X# s+ X* \2 c* e( X1 a$ Q[predict_label, ~, ~] = libsvmpredict(test_L,test_F(:,inmodel),model,'-q');
- ^* v) `9 m1 Q- U/ C* ^error=0;! Y* G+ v2 ], D* G% p: d0 o
for j=1:length(test_L)
0 j5 Z$ J/ L9 D  \. R1 w: f    if(predict_label(j,1) ~= test_L(j,1))
$ g7 A# e) ]3 c" B0 @0 T        error = error+1;) E5 L  G+ e4 P
    end
% d. ]6 H/ X  t+ E# e% cend
5 M$ _! o6 Q" p2 b! o+ z. }4 Ierror = error/length(test_L);
5 s7 n- }8 D5 V2 h1 i9 aanswer(i,2)={error};0 \9 h, p9 k  B8 K7 O
answer(i,3)={inmodel};* {+ Q  b0 w7 H  l5 F4 w
end
5 y; \9 G! M# A; j% ^8 P
2 n8 Y' U- }+ g  q# ^; T$ o1 _
, h, d2 r$ e9 Q! L/ R$ H. ]) ?6 h; t结果(选出的特征数和错误率):
8 n3 Z5 p# D8 H$ d# @特征数:3
# B4 {+ O8 n# U8 y$ ?- I- C错误率:0.1544
7 L+ b, R& ]5 r
" C5 {% E" V8 U* L( e- _- u2 m$ E* Y0 K2 U
7 ^# u8 @# |0 n0 J

作者: regngfpcb    时间: 2020-5-20 15:27
PSO算法特征选择MATLAB实现




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2