|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 uperrua 于 2020-5-20 14:28 编辑 , J& K8 ?. B( \# P J' D5 T* V
3 |6 N; P, ^6 H6 `& [7 z
PSO进行进行特征选择其主要思想是:将子集的选择看作是一个搜索寻优问题(wrapper方法),生成不同的组合,对组合进行评价,再与其他的组合进行比较。这样就将子集的选择看作是一个是一个优化问题。- T m5 a) }, o% Z/ S+ p0 X0 ~& A
% g# K% c7 B- F. n/ j) ]+ h, [! X$ K1 E+ o$ p8 n( v! p% k
下面是PSO进行特征选择的代码(注意:整体代码是单目标只优化错误率,注意训练使用的是林志仁SVM,数据集是Parkinson,可以到UCI上下载,训练的结果是错误率)7 ]% c9 M! r0 h) R2 b9 a; [ c
7 ?' B6 x2 H4 p1 Q+ ~数据集分割为训练集和测试集:. j3 O0 l7 N7 y* ]8 _$ F
$ O( }( M/ j- x( }
function divide_datasets
: w5 h( e% a. \( i& Aload Parkinson.mat;5 F9 s, i* \& T
dataMat=Parkinson_f;3 X* e; _6 H' U& s
len=size(dataMat,1);
: _% v% s s- h. A( ^" b' m/ _%归一化0 z& X# o, M B$ {- K1 G
maxV = max(dataMat);
& L/ |) a5 Q7 I2 J8 N% sminV = min(dataMat);
: p/ D5 R" v D w7 J0 P5 Rrange = maxV-minV;+ X1 S \6 k* B3 @- S- f0 v( F
newdataMat = (dataMat-repmat(minV,[len,1]))./(repmat(range,[len,1]));
" I; ^9 q( {1 K3 |) L2 p7 @: X# d
Indices = crossvalind('Kfold', length(Parkinson_label), 10);
5 Q. z. n7 ?1 ]; P5 {# A7 J1 Q( Xsite = find(Indices==1|Indices==2|Indices==3);
& L4 a+ d! z- Wtrain_F = newdataMat(site,: );4 q0 u" S) C- D$ V
train_L = Parkinson_label(site);
" G( B+ M P" J O6 a- B msite2 = find(Indices~=1&Indices~=2&Indices~=3);2 e. A- W/ `; V
test_F = newdataMat(site2,: );+ d% A8 a4 U5 ^! b D
test_L =Parkinson_label(site2);; b6 k* ?- |; N/ G* G/ ^
save train_F train_F;
# W- m* q7 s' h1 a- [. l: j0 Vsave train_L train_L;
* T! \9 ^6 n' u) B! Fsave test_F test_F;
& ?% J( k! L' @# R6 T2 O5 ysave test_L test_L;) w) i1 \% _: w5 U* J
end/ n2 n! G0 k. a! Z
: a3 }) l) W/ A0 d s: I; k( W6 f1 Y0 e) _* A: ^" H) D) }% Y
主函数PSOFS:
/ G+ E) e h4 E( v5 C9 U6 y: T$ I4 f, S- v
clear;* ^; a# q- m1 p2 I8 v1 E
clc;, m# w5 I F' E" l' O3 u
format long;
/ J- w0 F1 j; g%------给定初始化条件----------------------------------------------) @1 d5 q+ p7 L& h/ I
c1=2; %学习因子1
7 h0 x. v a4 ?c2=2; %学习因子2
6 k7 p B; e6 o* k( G) i+ |w=0.7; %惯性权重3 i2 @' G. p# F1 g$ e) T* A
MaxDT=100; %最大迭代次数
8 i8 w" n' d, |; H8 D/ f: @D=22; %搜索空间维数(未知数个数)3 u$ [& `7 c) r
M=30; %初始化群体个体数目
3 c) G% ] e) C; p0 L7 B$ Vbound=1;
4 A. @+ G1 Q* g* P( f* I% S& L& C%eps=10^(-6); %设置精度(在已知最小值时候用)1 t' L5 o* h2 d2 [
global answer %最后所有粒子的结果(包括特征与精确度)# Y# o$ G! A: o) @: a' c5 X
answer=cell(M,3);
; u( ^1 N! @0 Rglobal choice %选出的特征个数+ a1 s8 A; ?. ?" n
choice=0.8;
3 H. r/ Q0 S" l3 J. l6 s' S- v& v& C' y* a* B
%------初始化种群的个体(可以在这里限定位置和速度的范围)------------
3 f/ S6 \5 |5 o* P2 @* a f6 h& e3 ]8 Z. ~( i7 l+ f* n
x=randn(M,D); %随机初始化位置
' N4 @" }( U4 {4 V e Rv=randn(M,D); %随机初始化速度
, m! d! z _) Kx(x>bound)=bound;0 G. h" U3 {8 \- D0 G
x(x<-bound)=-bound;
- A9 G/ V D* L: M' _! i. {%------先计算各个粒子的适应度,并初始化p(i)和gbest--------------------
7 C, R z. S) w8 R4 s! }/ {divide_datasets();3 e2 S) k8 Z( W
for i=1:M& t# [! f* ? j" m* \
p(i)=fitness(x(i,: ),i);
0 J% B+ D7 Q' s0 n: A& W+ t$ p y(i,: )=x(i,: );
. n! C3 U. ?& |% A4 t. ~9 Fend
# o2 C8 p6 o8 H Xgbest=x(1,: ); %gbest为全局最优
! h- f* |% x0 H8 S8 {" p2 s6 e5 T$ Z$ Q! h. V, D
for i=2:M
( r) b1 W1 P, M if(fitness(x(i,: ),i)<fitness(gbest,i))
( w/ n( ^: @% P5 x% r gbest=x(i,: );
. a: u8 A3 s; y. p! b2 J" ^, V5 j end
. V' U; O$ L" {/ C# B' Vend
; A8 T. T" s; B* o" y: Y8 ~) D" ?+ P- q7 F$ u) `
%------进入主要循环,按照公式依次迭代,直到满足精度要求------------0 B2 F4 t. b! c S/ i0 n
for t=1:MaxDT. j, q: H3 T C6 ^
for i=1:M9 q8 H( ^3 g/ z L! t% i
v(i,: )=w*v(i,: )+c1*rand*(y(i,: )-x(i,: ))+c2*rand*(gbest-x(i,: ));, L3 A! K: \% W/ V3 b7 ]: W" [$ G
x(i,: )=x(i,: )+v(i,: );
; k3 P! }2 w ]$ f if fitness(x(i,: ),D)<p(i)
$ e7 Q" ?5 n+ H% o }: Q p(i)=fitness(x(i,: ),i);
% ? }; J! [, b4 c$ ]% i8 \ y(i,: )=x(i,: );3 n% H* b6 k% e5 q. Z' a6 U3 m- b9 O0 Q
end
/ F( o4 p1 S9 i# l. { if p(i)<fitness(gbest,i)6 Y& ~9 M. G* E9 b% t5 z
gbest=y(i,: );
3 O$ _' t1 o( S3 B5 r! [ end3 @/ z: Y; g8 c& [, W
end7 Y' @: \1 E3 h. [
end' x( s Y. u# L2 A6 D: R* J
0 ?$ g5 {. v) T1 M/ e' j
%------显示计算结果4 V9 Y+ M5 D' J
disp('*************************************************************')5 B: ?( {: z) r; }3 ^8 L
Solution=gbest';0 J: X4 w* a! N" L; s+ \# V0 b
Result=fitness(gbest,i);! p$ E* s3 B0 S
disp('*************************************************************')1 b3 w6 i. {' d( M. u9 I7 T! L
9 ~( r1 C8 m* |! T
" ^' N- I+ f# k特征选择评价函数(利用林志仁的SVM进行训练):8 O0 {: `% |6 L5 L0 ?. n
5 S r9 T8 s+ C. B
function error = fitness(x,i)
: ]+ d0 F3 Q7 B$ ~8 Fglobal answer0 W8 p& \* E" H
global choice5 E: |2 G5 w0 l; V8 }8 m
load train_F.mat;! F$ m! y% a' T# s3 p' b9 A3 H
load train_L.mat;
2 I+ z$ [( e% J( c* Rload test_F.mat;
6 C6 T6 `4 K2 C) rload test_L.mat;, ?, N- p7 k5 @2 B, ]/ I
3 d c) B0 S* q8 Q, B
inmodel = x>choice;%%%%%设定恰当的阈值选择特征
$ b# c( h- F) Qanswer(i,1)={sum(inmodel(1,: ))};! L( t( ]) Z2 u8 o5 Z: E
model = libsvmtrain(train_L,train_F(:,inmodel));, N( y3 g" r" a# t" `( Q
[predict_label, ~, ~] = libsvmpredict(test_L,test_F(:,inmodel),model,'-q'); , ^/ p e4 |) \& ]' B
error=0;
5 H5 l, W- }% ^for j=1:length(test_L)
1 ]* }/ i% T/ S1 X0 N if(predict_label(j,1) ~= test_L(j,1))4 c4 Q$ U h% d% o( R' T
error = error+1;) X; H' ^4 @' M/ {
end
7 U1 v c) O+ V& y/ o) C3 ~end" h9 l' S% U9 c3 y1 b
error = error/length(test_L);
) R# U) j, R6 X5 r! R$ q3 u4 I- qanswer(i,2)={error};
9 |4 W0 m5 a' @. l& t, Zanswer(i,3)={inmodel};: }2 M( g, {4 e [3 w
end
9 F( H4 H* M$ e( F* K+ U, r
- `8 O+ J/ a7 e: l% e0 _( _0 f* I+ o3 W G
结果(选出的特征数和错误率): & v/ V. w& |* m$ L
特征数:3
: C7 j/ I9 h+ Z: j. A错误率:0.1544
! l6 D t/ N. _* |- G
0 P) L$ q: m3 G8 a! ?5 r- N( q2 O4 K; |3 n* c- A( S9 a+ m" H H
3 a: L0 P) w/ B
|
|