TA的每日心情 | 怒 2019-11-20 15:22 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
+ L& n# i6 e" A, M7 s4 W# U, Q
(1)序列前向选择( SFS , Sequential Forward Selection )/ s' X* M7 I6 b& @0 Z/ p) e* ?8 ]
4 p0 k& o7 w5 A" r, H算法描述:特征子集X从空集开始,每次选择一个特征x加入特征子集X,使得特征函数J( X)最优。简单说就是,每次都选择一个使得评价函数的取值达到最优的特征加入,其实就是一种简单的贪心算法。/ z) d% }$ _" O7 S/ |# ?/ Z
# R9 H/ X$ U$ M: n* e, Z
' |) y, u$ o5 _: m# S
s% u; Z u. K0 E- f# F- E3 _% ~
! g6 ], y j' s. Z: t3 E- E
9 w/ t4 m# s- J% v& [算法评价:缺点是只能加入特征而不能去除特征。例如:特征A完全依赖于特征B与C,可以认为如果加入了特征B与C则A就是多余的。假设序列前向选择算法首先将A加入特征集,然后又将B与C加入,那么特征子集中就包含了多余的特征A。
& S( b8 T" r+ m3 E5 ?- t+ W* D5 O7 D* K, n5 f5 B
代码:( g0 j7 _$ U% F# \& }
6 V I6 U# l: Y
- %----4.17编 顺序前进法特征选择 成功!
- x7 O X. C4 [
- clear;
- clc;
- %--------特征导入 请自行修改
$ U% Q$ p' N- a6 z$ S- 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
- 9 b5 B- d3 Y5 O j/ f/ w
- % for i=1:96
7 ]( m2 Y" U3 E3 A& Z9 i+ ~- % wfeature{30+i}=feature(:,i);
% E2 k3 o6 s# S+ B( n- % end
: R& @ w c& w/ E- %%%%%%%----------归一化
: h( H2 A8 e3 _8 W1 ^- [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个特征尝试
- N; O: n4 q9 j- C% i1 U- 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
- %%%%%%%%聚类
2 x3 n* g" P' A7 L/ l- [IDC,U]=kmeans(tezh,2);
- cc(IDC==1,1)=0;
- cc(IDC==2,1)=0.75;
- " K X7 L- Z1 h/ R: q* E& T* w
- g=reshape(cc,M,N);
- figure,imshow(g);
" N3 Z; V: {+ o0 `8 }$ J; b' F8 o
% _0 L$ p$ s! ?* d# o
: ]2 s5 Z6 b: p& H8 ]. X# Z(2)序列后向选择( SBS , Sequential Backward Selection )* ^* G0 E A) J$ P) H% Z8 \
6 Q* S) f1 r, [" @; O
算法描述:从特征全集O开始,每次从特征集O中剔除一个特征x,使得剔除特征x后评价函数值达到最优。
% L% l. R. Q8 ?- g
8 N6 `! l& ~8 n- v+ H& b, x; f算法评价:序列后向选择与序列前向选择正好相反,它的缺点是特征只能去除不能加入。& ^, p* M) ~: _3 W# w* I
* n# ~0 H9 M+ T
2 r6 j( ^4 ]8 d. {# E
$ G" U2 ^! @9 [; Z代码:0 [8 D3 W3 b9 \: { E- v
! V% N" Q3 h: F0 W% @
- %----4.17编 顺序后退法特征选择
3 i" j$ \" v' g& _ s! A- clear;
- clc;
- %--------特征导入 请自行修改
- : P0 Q- M( E. j! O3 W5 D1 L
- 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
- %%%%%%%----------归一化-归一化
- " e" x, m& i" P3 x
- [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
/ |3 E" i7 p4 w( N! b- chosen=[];dele=[];
- for i=1:30
- chosen=[chosen i];
- end
7 S$ V% J# e" i r- z- 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];
- . B8 j& y3 u% ^. a) @2 E
- [mm nn]=size(chosen);
- tezh=[];
- for i=1:nn
- tezh=[tezh feature{chosen(i)}];
- end
- %%%%%%%%聚类
- + V$ s; a( j) L
- [IDC,U]=kmeans(tezh,2);
- cc(IDC==1,1)=0;
- cc(IDC==2,1)=0.75;
- g=reshape(cc,M,N);
- figure,imshow(g);
- %%%%%%%%%%%%计算正确率
+ a1 U1 v7 e* ~$ Q- 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
% [% g0 Z! H) t- V- X2 E, I # T/ G/ \0 s$ W/ T+ l. }& ?
0 H+ C( D! r! n: t# B8 F另外,SFS与SBS都属于贪心算法,容易陷入局部最优值。 |
|