matlab自带的sbs算法,SFS与SBS特征选择算法

(1)序列前向选择( SFS , Sequential Forward Selection )

算法描述:特征子集X从空集开始,每次选择一个特征x加入特征子集X,使得特征函数J( X)最优。简单说就是,每次都选择一个使得评价函数的取值达到最优的特征加入,其实就是一种简单的贪心算法。

c5dc6dbe4dcd5bfdd4aca118f0423d91.png

d45982f3dd87b071a47b93e664801549.png

算法评价:缺点是只能加入特征而不能去除特征。例如:特征A完全依赖于特征B与C,可以认为如果加入了特征B与C则A就是多余的。假设序列前向选择算法首先将A加入特征集,然后又将B与C加入,那么特征子集中就包含了多余的特征A。

代码:

MATLAB

%----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);

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;

loadcoourfeature16_0521_Aerial1%%%共生矩阵 96.14%

wfeature{1}=coourfeature(:,1);

wfeature{2}=coourfeature(:,2);

wfeature{3}=coourfeature(:,3);

loadfufeature_0521_SARAerial1_512%%复小波  98.26%

fori=1:13

wfeature{3+i}=wavefeature(:,i);

end

loadwavefeature_0521_SARAerial1_512%%%非下采样小波  97.58%

fori=1:7

wfeature{16+i}=wavefeature(:,i);

end

loadwavefeature_0521_Aerial1%%小波 97.65%

fori=1:7

wfeature{23+i}=wavefeature(:,i);

end

%loadrwt_cofeature96_0423_lsy1

%fori=1:96

%wfeature{30+i}=feature(:,i);

%end

%%%%%%%----------归一化

[mn]=size(wfeature{1});

forj=1:30%一共30组特征 这里 请自行修改

mx=max(wfeature{j});

mi=min(wfeature{j});

mxx=(mx-mi);

mii=ones([mn])*mi;

wfeature{j}=(wfeature{j}-mii)./mxx;

end

%%---------------SFS先选4个特征尝试

chosen=[];%%表示已选的特征

chosen=[chosen1];

Jc=0;%%选出的J值

forj=1:5%选5个特征

J=zeros([130]);

fori=2:30%一共30组特征 这里 请自行修改

[mmnn]=size(chosen);

forp=1:nn

ifi==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);

fori=1:30

ifJ(i)==0

J(i)=mi;

end

end

ma=max(J);

fori=1:30

ifJ(i)==ma

chosen=[choseni];

break;

end

end

end

saveAerial1_6t_chosenchosen

[mmnn]=size(chosen);

tezh=[];

fori=1:nn

tezh=[tezhwfeature{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后评价函数值达到最优。

算法评价:序列后向选择与序列前向选择正好相反,它的缺点是特征只能去除不能加入。

a43e6aefa1f6eabddfd5e3633df426f8.png

代码:

MATLAB

%----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

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');

[MN]=size(A);

loadcoourfeature_0414_lsy1%%%共生矩阵 96.14%

feature{1}=coourfeature(:,1);

feature{2}=coourfeature(:,2);

feature{3}=coourfeature(:,3);

loadfuwavefeature_0413_lsy1%%复小波  98.26%

fori=1:13

feature{3+i}=wavefeature(:,i);

end

loadwavefeature_0413_feixia_lsy1%%%非下采样小波  97.58%

fori=1:7

feature{16+i}=wavefeature(:,i);

end

loadwavefeature_0417_lsy1%%小波 97.65%

fori=1:7

feature{23+i}=wavefeature(:,i);

end

%%%%%%%----------归一化-归一化

[mn]=size(feature{1});

forj=1:30%一共30组特征 这里 请自行修改

mx=max(feature{j});

mi=min(feature{j});

mxx=(mx-mi);

mii=ones([mn])*mi;

feature{j}=(feature{j}-mii)./mxx;

end

%%---------------SBS

chosen=[];dele=[];

fori=1:30

chosen=[choseni];

end

forj=1:24%%删10个,留20个

J=zeros([130]);ii=0;%J(1)是删1的结果,J(2)是删除2 的结果......

fori=1:30%???dele 是必要的么???????????????????????%一共30组特征 这里 请自行修改

[mmnn]=size(chosen);

forp=1:nn

ifsum(i==dele)~=0

J(i)=0;

break;

else

forq=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);

forcc=1:30

ifJ(cc)==0

J(cc)=mi;

end

end

[mawe]=max(J);

dele=[delewe];

fordd=1:nn

ifchosen(dd)==we

chosen(dd)=[];

end

end

%chosen=[245678911121314192022232627282930];

[mmnn]=size(chosen);

tezh=[];

fori=1:nn

tezh=[tezhfeature{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;

fori=1:M

forj=1:M/2

ju(i,j)=0;

end

end

ju2=g-ju;

prob=prod(size(find(ju2~=0)))/(m*n)

1-prob

另外,SFS与SBS都属于贪心算法,容易陷入局部最优值。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值