找回密码
 注册
关于网站域名变更的通知
查看: 578|回复: 1
打印 上一主题 下一主题

PSO算法特征选择MATLAB实现(单目标)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-10-20 17:19 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
0 C, f/ B/ ]# u0 N0 k
PSO进行进行特征选择其主要思想是:将子集的选择看作是一个搜索寻优问题(wrapper方法),生成不同的组合,对组合进行评价,再与其他的组合进行比较。这样就将子集的选择看作是一个是一个优化问题。3 C+ o& m" i# `
, a' L5 h. z0 P6 \. e9 @6 x
下面是PSO进行特征选择的代码(注意:整体代码是单目标只优化错误率,注意训练使用的是林志仁SVM,数据集是Parkinson,可以到UCI上下载,训练的结果是错误率)
1 `( |# Q5 J4 I) U4 r: X
& t  I, z& H6 n数据集分割为训练集和测试集:5 J, W" \8 _# ^& f. g( W/ a
6 q4 t1 H. }1 }8 n- s3 L3 g' X
  • 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- L# a; M( d; A$ o4 P  n3 c+ y; Z+ z* x
   
/ U* @) l1 Q0 C  a0 ^9 `
# q* Y4 o$ y7 f( ~2 S2 |9 H; o主函数PSOFS:# B, w1 I6 k5 k: w  s+ d
/ g- C* B8 V1 g' V7 R
  • 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('*************************************************************')+ H" M7 U$ C- C2 @3 _/ I
           
' [* ^, b, a& `# r
) p: L7 L5 D0 {$ i7 Y0 ?2 H特征选择评价函数(利用林志仁的SVM进行训练):
; ?1 b% s; d! S) \/ v0 w7 ?. n2 Y+ Y# ^7 X% u% z1 s# s4 ^
  • 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/ ~: P% u6 o$ T( d4 ^! V
3 k5 o/ y2 _1 D" t4 F: \
结果(选出的特征数和错误率):! U$ s" Q4 w) I2 H( J% f

2 y  s; I0 ]$ C0 u / A( r! o% _% P; s  D

该用户从未签到

2#
发表于 2020-10-20 20:13 | 只看该作者
PSO算法特征选择MATLAB实现
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 13:57 , Processed in 0.156250 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表