|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 uperrua 于 2020-5-20 14:28 编辑
( C8 |* T j8 K7 q5 j3 Q- y k
. N8 k h9 L- Y- w$ CPSO进行进行特征选择其主要思想是:将子集的选择看作是一个搜索寻优问题(wrapper方法),生成不同的组合,对组合进行评价,再与其他的组合进行比较。这样就将子集的选择看作是一个是一个优化问题。
1 K: W# e( Y1 V1 ]9 _
& k, K' a& D! X2 n
" c, R. a1 y! C$ O8 x- g下面是PSO进行特征选择的代码(注意:整体代码是单目标只优化错误率,注意训练使用的是林志仁SVM,数据集是Parkinson,可以到UCI上下载,训练的结果是错误率)% {% T* U g3 K. L# [+ u# ^
- x' P; y* V- N0 ?; @6 W数据集分割为训练集和测试集:
3 Q% d2 P, k. A% C
; X; u# I8 l$ Q; \3 g+ [1 y& r+ xfunction divide_datasets
2 ~$ |3 O! e$ b# R8 sload Parkinson.mat;# h; c& l1 X4 p, X4 m+ W
dataMat=Parkinson_f;; D! J) ^4 j1 K" ~) a- }- P* D
len=size(dataMat,1);3 ?3 D' M& e0 k7 R, P& }
%归一化1 b0 ~0 H; z) E+ u2 W) Q- W
maxV = max(dataMat);
& ?+ g; Y% m' k) a N. |( rminV = min(dataMat);5 l6 U8 b C* M5 f$ s' F
range = maxV-minV;+ d* z9 Z1 Z- R, m# C# H
newdataMat = (dataMat-repmat(minV,[len,1]))./(repmat(range,[len,1]));
* x. } f; V; w% t& T& k) F* L/ g! `# e) v. n' d
Indices = crossvalind('Kfold', length(Parkinson_label), 10);$ S5 ~" y8 q1 E% V, V# s1 ?
site = find(Indices==1|Indices==2|Indices==3);8 X( g1 C3 t7 f4 U+ H
train_F = newdataMat(site,: );( u* x6 P9 U) A
train_L = Parkinson_label(site);0 J/ ?; k- p" H9 k L3 }0 \
site2 = find(Indices~=1&Indices~=2&Indices~=3);; J( {" h8 U4 P( F
test_F = newdataMat(site2,: );/ r( S1 U" O s
test_L =Parkinson_label(site2);( @/ p1 `# ^2 [! m; e
save train_F train_F;
: K$ J, B3 I( R5 E& R5 D( k# ]/ Fsave train_L train_L;
: L. N- U1 G$ ]0 q+ _& s1 \: qsave test_F test_F;& k" C3 b% {* Q$ F7 I! h) A7 k6 }
save test_L test_L;: D, K! x) x* t# s% N
end& H& d6 r# a8 ]) `: ]
7 D# |1 A6 {5 o& q, w7 u; D9 |
9 |3 p4 R1 `- j7 q2 R0 @主函数PSOFS:
# p6 Y; `: z* l, c B; a. f( w8 Z& e5 ]! f) {! p/ n
clear;
$ v! D8 Y0 h% ]' u$ xclc;; e- v2 S1 C! P9 P8 }8 W% q
format long;
Q8 ?9 Q) ~: Q5 U6 f7 A%------给定初始化条件---------------------------------------------- X1 x% m2 k6 ]. G1 E
c1=2; %学习因子1
3 u8 l2 Q z6 S ?! y- \c2=2; %学习因子2( v. l; Y2 a! ?& U# W
w=0.7; %惯性权重* _) h, U* l9 z/ T6 { L$ T
MaxDT=100; %最大迭代次数3 U% p4 @$ X+ ?+ ^" k
D=22; %搜索空间维数(未知数个数)
+ K& ^1 x C6 K# k" Y4 `, ]% HM=30; %初始化群体个体数目
/ B& J+ j1 ^8 E1 sbound=1;+ t# y8 E+ z6 O. c
%eps=10^(-6); %设置精度(在已知最小值时候用)
/ L0 j4 f2 z- k0 B' A1 Nglobal answer %最后所有粒子的结果(包括特征与精确度)* O# P& A2 @) R! l, h
answer=cell(M,3);
' A8 |, E- \ O. r5 X4 F) ^global choice %选出的特征个数5 P: u0 M' U$ J& ]
choice=0.8;
* K0 K) t+ G* M1 S$ L8 o' w5 e0 u( M7 E% o* W& N
%------初始化种群的个体(可以在这里限定位置和速度的范围)------------
1 M/ b5 F' y" }5 c3 ~& A! M
! J' L# |! V7 E7 x0 u& g& R# ?x=randn(M,D); %随机初始化位置( B3 ]# @# o# c6 D
v=randn(M,D); %随机初始化速度
" V2 E6 a& M3 [& Ux(x>bound)=bound;) q- L" K, a. x8 E$ H
x(x<-bound)=-bound;
2 @. G5 B: m& |; e" N7 X%------先计算各个粒子的适应度,并初始化p(i)和gbest--------------------8 G1 S/ [& c6 I7 |1 G, t
divide_datasets();& G* G. K6 E$ c+ ?' m( ]
for i=1:M, ?& n% ?* h% T, \; n+ [( m$ n
p(i)=fitness(x(i,: ),i);
. V5 B! ^; ]# [; }; K5 j: R y(i,: )=x(i,: );
$ G# \% B" R0 W# T0 s5 |end
/ d/ ^' P+ [+ F" `gbest=x(1,: ); %gbest为全局最优
& h. C; L( @% q) H; R
1 Q2 N# [4 [+ b3 xfor i=2:M! ]4 K# I P7 J0 u# c
if(fitness(x(i,: ),i)<fitness(gbest,i))2 x' O9 _1 |0 D2 K) k0 ^, B
gbest=x(i,: );' P6 P1 e0 c9 V5 Z( q$ t
end
1 |5 f. b% |9 H7 }/ m+ bend- ?' I' e0 Q4 |
( f, N8 p9 H9 ?%------进入主要循环,按照公式依次迭代,直到满足精度要求------------
7 t6 y& N: h! D, V, \for t=1:MaxDT4 ^# H" y! g b# b% ?9 q+ T7 U) L4 c
for i=1:M: T: d8 _1 {$ { m# [$ v
v(i,: )=w*v(i,: )+c1*rand*(y(i,: )-x(i,: ))+c2*rand*(gbest-x(i,: ));7 Y$ _! a- b3 A
x(i,: )=x(i,: )+v(i,: );
/ A& r2 ~6 I& k* [" C. @' t if fitness(x(i,: ),D)<p(i) g! A4 f' }$ M, H# j
p(i)=fitness(x(i,: ),i);
P* d9 P8 M% V- \! v3 t y(i,: )=x(i,: );
% B& Y2 J0 ?- K. @3 y end& I+ \6 c+ Q; e! G. m3 b
if p(i)<fitness(gbest,i)0 T2 c* Q0 @, t: _( x) |+ r
gbest=y(i,: );
0 T# |1 F' m O; {4 l5 ~ end6 j% t1 A* z8 m0 z# d
end
( r. o* z$ I P% C) d* tend' }* y& t2 M2 T5 l* x# Z
2 H+ }, H4 ~& g3 z. r! x9 e9 i%------显示计算结果
6 Q3 o0 C. a0 ^& @1 i U( d+ j" F' zdisp('*************************************************************')5 U( M5 D- ]+ v$ v1 w+ U% z
Solution=gbest';4 Y M% X- C+ w9 b
Result=fitness(gbest,i);
, R# @1 C5 I' ?0 m7 X7 Fdisp('*************************************************************')
# M% @( l; q0 @4 s' L
$ B$ J, R# p' Y K
, T: V0 d0 B1 V' l特征选择评价函数(利用林志仁的SVM进行训练):
4 y4 P4 e r0 k! D5 l0 q Q8 @1 O+ r
function error = fitness(x,i)
, M v$ ]# t+ V+ H+ _6 rglobal answer
" o" @2 w$ w1 }9 D. O" @! ?) p& fglobal choice2 T. ^+ T! p. E* i8 G3 W/ r! B
load train_F.mat;6 @) B) l* w( y# U! H: ]; y
load train_L.mat;
! K# M' U5 n6 e1 ^, W" ]load test_F.mat;
0 |+ q9 p, t% Z9 {/ G, Z3 J$ D9 D% wload test_L.mat;8 W5 `$ ?$ q7 ~- O
! g! c$ y r* i6 i$ S' m1 V, _
inmodel = x>choice;%%%%%设定恰当的阈值选择特征2 F/ y* N( F9 e5 F: t
answer(i,1)={sum(inmodel(1,: ))};
( v' k2 f' @5 }% W$ rmodel = libsvmtrain(train_L,train_F(:,inmodel));8 ?3 G$ h- J# N$ G' }% R$ F' }
[predict_label, ~, ~] = libsvmpredict(test_L,test_F(:,inmodel),model,'-q'); 6 F5 n# E& e% r! ?# u1 A
error=0;# M4 T" U/ [$ _3 d
for j=1:length(test_L); e# j4 D% z9 R
if(predict_label(j,1) ~= test_L(j,1))
" v" l1 e- Y* A* j. x9 H) A" y, D* \ error = error+1;
$ P" v0 N; N- C end
7 n# }' G0 b$ S$ yend
/ L5 N8 j4 I5 Perror = error/length(test_L);4 k) J, f' m* k( A* z
answer(i,2)={error};" c3 X% K y4 B3 h/ z' A/ M4 D1 i1 U
answer(i,3)={inmodel};
, ~) J* `2 j% T& u& ^end$ f! V, Y1 O: {+ |: M+ H2 n+ g. d
. i* T9 T. i8 q
! ?, \' e5 A9 n7 _结果(选出的特征数和错误率): + T |: o Z; ?, I
特征数:3 ' c J6 o# x6 r: ~' ]& q( N& Z) s
错误率:0.15444 } t1 Q) ^2 d, O |- |
& k# `) y O8 n- K4 Q/ v5 O: B/ @4 ~ k4 w. q ?# u6 x+ M6 E
8 g4 l8 V$ \' J% f8 M1 p- k* P
|
|