(1)序列前向选择( SFS , Sequential Forward Selection )
算法描述:特征子集X从空集开始,每次选择一个特征x加入特征子集X,使得特征函数J( X)最优。简单说就是,每次都选择一个使得评价函数的取值达到最优的特征加入,其实就是一种简单的贪心算法。
算法评价:缺点是只能加入特征而不能去除特征。例如:特征A完全依赖于特征B与C,可以认为如果加入了特征B与C则A就是多余的。假设序列前向选择算法首先将A加入特征集,然后又将B与C加入,那么特征子集中就包含了多余的特征A。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
%----4.17编 顺序前进法特征选择 成功! clear; clc; %--------特征导入 请自行修改 M=512;N=512; load coourfeature16_0521_Aerial1 %%%共生矩阵 96.14% wfeature{1}=coourfeature(:,1); wfeature{2}=coourfeature(:,2); wfeature{3}=coourfeature(:,3); load fufeature_0521_SARAerial1_512%%复小波 98.26% for i=1:13 wfeature{3+i}=wavefeature(:,i); end load wavefeature_0521_SARAerial1_512%%%非下采样小波 97.58% for i=1:7 wfeature{16+i}=wavefeature(:,i); end load wavefeature_0521_Aerial1%%小波 97.65% for i=1:7 wfeature{23+i}=wavefeature(:,i); end % load rwt_cofeature96_0423_lsy1 % for i=1:96 % wfeature{30+i}=feature(:,i); % end %%%%%%%----------归一化 [m n]=size(wfeature{1}); for j=1:30%一共30组特征 这里 请自行修改 mx=max(wfeature{j}); mi=min(wfeature{j}); mxx=(mx-mi); mii=ones([m n])*mi; wfeature{j}=(wfeature{j}-mii)./mxx; end %%---------------SFS 先选4个特征尝试 chosen=[];%%表示已选的特征 chosen=[chosen 1]; Jc=0;%%选出的J值 for j=1:5 %选5个特征 J=zeros([1 30]); for i=2:30 %一共30组特征 这里 请自行修改 [mm nn]=size(chosen); for p=1:nn if i==chosen(p) J(i)=0; break; else J(i)=J(i)-sum(sum((wfeature{i}-wfeature{chosen(p)}).^2)); end end end mi=min(J); for i=1:30 if J(i)==0 J(i)=mi; end end ma=max(J); for i=1:30 if J(i)==ma chosen=[chosen i]; break; end end end save Aerial1_6t_chosen chosen [mm nn]=size(chosen); tezh=[]; for i=1:nn tezh=[tezh wfeature{chosen(i)}]; end %%%%%%%%聚类 [IDC,U]=kmeans(tezh,2); cc(IDC==1,1)=0; cc(IDC==2,1)=0.75; g=reshape(cc,M,N); figure,imshow(g); |
(2)序列后向选择( SBS , Sequential Backward Selection )
算法描述:从特征全集O开始,每次从特征集O中剔除一个特征x,使得剔除特征x后评价函数值达到最优。
算法评价:序列后向选择与序列前向选择正好相反,它的缺点是特征只能去除不能加入。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
%----4.17编 顺序后退法特征选择 clear; clc; %--------特征导入 请自行修改 A=imread('lsy1.gif'); [M N]=size(A); load coourfeature_0414_lsy1 %%%共生矩阵 96.14% feature{1}=coourfeature(:,1); feature{2}=coourfeature(:,2); feature{3}=coourfeature(:,3); load fuwavefeature_0413_lsy1 %%复小波 98.26% for i=1:13 feature{3+i}=wavefeature(:,i); end load wavefeature_0413_feixia_lsy1%%%非下采样小波 97.58% for i=1:7 feature{16+i}=wavefeature(:,i); end load wavefeature_0417_lsy1%%小波 97.65% for i=1:7 feature{23+i}=wavefeature(:,i); end %%%%%%%----------归一化-归一化 [m n]=size(feature{1}); for j=1:30%一共30组特征 这里 请自行修改 mx=max(feature{j}); mi=min(feature{j}); mxx=(mx-mi); mii=ones([m n])*mi; feature{j}=(feature{j}-mii)./mxx; end %%---------------SBS chosen=[];dele=[]; for i=1:30 chosen=[chosen i]; end for j=1:24 %%删10个,留20个 J=zeros([1 30]);ii=0; %J(1)是删1的结果,J(2)是删除2 的结果...... for i=1:30 %???dele 是必要的么???????????????????????%一共30组特征 这里 请自行修改 [mm nn]=size(chosen); for p=1:nn if sum(i==dele)~=0 J(i)=0; break; else for q=1:nn if (chosen(q)~=i) & (chosen(p)~=i) J(i)=J(i)-sum(sum((feature{chosen(q)}-feature{chosen(p)}).^2)); end end end end end mi=min(J); for cc=1:30 if J(cc)==0 J(cc)=mi; end end [ma we]=max(J); dele=[dele we]; for dd=1:nn if chosen(dd)==we chosen(dd)=[]; end end % chosen=[2 4 5 6 7 8 9 11 12 13 14 19 20 22 23 26 27 28 29 30]; [mm nn]=size(chosen); tezh=[]; for i=1:nn tezh=[tezh feature{chosen(i)}]; end %%%%%%%%聚类 [IDC,U]=kmeans(tezh,2); cc(IDC==1,1)=0; cc(IDC==2,1)=0.75; g=reshape(cc,M,N); figure,imshow(g); %%%%%%%%%%%%计算正确率 ju=ones(M)*0.75; for i=1:M for j=1:M/2 ju(i,j)=0; end end ju2=g-ju; prob=prod(size(find(ju2~=0)))/(m*n) 1-prob |
另外,SFS与SBS都属于贪心算法,容易陷入局部最优值。