|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
' a$ q; C+ s5 i: H) J% J% P
PSO进行进行特征选择其主要思想是:将子集的选择看作是一个搜索寻优问题(wrapper方法),生成不同的组合,对组合进行评价,再与其他的组合进行比较。这样就将子集的选择看作是一个是一个优化问题。
& s: d1 Y) l, |/ S- R! e, E j" w D/ z' n% Q5 X+ K: t
下面是PSO进行特征选择的代码(注意:整体代码是单目标只优化错误率,注意训练使用的是林志仁SVM,数据集是Parkinson,可以到UCI上下载,训练的结果是错误率)
# z/ I Y. R& ?, P& \1 `( K' E& X8 T: f8 S; K
数据集分割为训练集和测试集:
: W& \! H6 ~. F5 C5 v* G4 l* n3 q
) D+ T i* v/ Y/ p! ?: m- 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 _1 f% f: R0 \, j/ m
$ r" Z% w& ?5 j% ^' N; Z! z$ f7 P4 X5 p- \
主函数PSOFS:
# W- p4 m: H1 @$ ?+ u% }) s7 z0 R ^" m
- clear;
- clc;
- format long;
- %------给定初始化条件----------------------------------------------
- c1=2; %学习因子1
- c2=2; %学习因子2
- w=0.7; %惯性权重
- MaxDT=100; %最大迭代次数
- D=22; %搜索空间维数(未知数个数)
- M=30; %初始化群体个体数目
- bound=1;
- %eps=10^(-6); %设置精度(在已知最小值时候用)
- global answer %最后所有粒子的结果(包括特征与精确度)
- answer=cell(M,3);
- global choice %选出的特征个数
- choice=0.8;
- %------初始化种群的个体(可以在这里限定位置和速度的范围)------------
- x=randn(M,D); %随机初始化位置
- v=randn(M,D); %随机初始化速度
- x(x>bound)=bound;
- x(x<-bound)=-bound;
- %------先计算各个粒子的适应度,并初始化p(i)和gbest--------------------
- divide_datasets();
- for i=1:M
- p(i)=fitness(x(i,:),i);
- y(i,:)=x(i,:);
- end
- gbest=x(1,:); %gbest为全局最优
- for i=2:M
- if(fitness(x(i,:),i)<fitness(gbest,i))
- gbest=x(i,:);
- end
- end
- %------进入主要循环,按照公式依次迭代,直到满足精度要求------------
- for t=1:MaxDT
- for i=1:M
- v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(gbest-x(i,:));
- x(i,:)=x(i,:)+v(i,:);
- if fitness(x(i,:),D)<p(i)
- p(i)=fitness(x(i,:),i);
- y(i,:)=x(i,:);
- end
- if p(i)<fitness(gbest,i)
- gbest=y(i,:);
- end
- end
- end
- %------显示计算结果
- disp('*************************************************************')
- Solution=gbest';
- Result=fitness(gbest,i);
- disp('*************************************************************'). X, p& P& \/ A
X) O3 w) i* a. ~: _0 u
/ q% n7 W0 f0 _! \+ H# v" h& j9 L特征选择评价函数(利用林志仁的SVM进行训练):: `" t9 ~) @) ~6 n8 a% ?
5 m$ @7 o3 O4 }- function error = fitness(x,i)
- global answer
- global choice
- load train_F.mat;
- load train_L.mat;
- load test_F.mat;
- load test_L.mat;
- inmodel = x>choice;%%%%%设定恰当的阈值选择特征
- answer(i,1)={sum(inmodel(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);
- answer(i,2)={error};
- answer(i,3)={inmodel};
- end# q4 f- U: m8 i6 T9 u# O7 D
8 |# s3 i Z0 k6 M% b) h) {* S
结果(选出的特征数和错误率):
$ W( g0 \4 ^: A! X* r/ D8 ~
! x- \6 g' i% g- t: g8 s2 s7 `
+ N/ q4 }! Z; n! h/ T9 C3 j' {4 x
|
|