Fisher线性判别

MATLAB验证Fisher线性判别


一、概念

Fisher判别法的基本思想是寻找一个最好的投影方向,在这个方向的直线上,d维样本的投影能分开的最好。问题是如何根据实际情况找到这条最好的、最易于分类的投影线。这就是fisher法所要解决的基本问题。
一维空间的Fisher线性判别函数为:

fisher1

其中,m1和m2是两个样本的均值,S1,S2分别为各类样本的的类内离散度。投影方向w为:

fisher2

在Fisher判决函数中,分子反应了映射后两类中心的距离平方,该值越大,类间可分性越好;分母反应了两类的类内的离散度,其值越小越好;从总体上讲, 的值越大越好,在这种可分性评价标准下,使 达到最大值的 即为最佳投影方向。以上所做的全部工作都是将d维空间的样本集映射成一维样本集,然后,我们只需要再确定一个阈值,将投影点与阈值比较,便可作出决策。本程序中,采用的是:

阈值=(m1-m2)/2

然后再根据决策规则比较投影与阈值大小就可判断属于什么类型。

Fisher线性判别的主要优点是简单,容易实现,且计算量和存储量小。

二、流程图

fisher3

三、核心代码

sonar

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
clear all;
A=xlsread('C:\Users\ASUS\Desktop\sonar.xls');
for m=1:10
disp(sprintf(' 第%d次测试结果 ',m));
k=0;
for c=1:208
if A(c,61)==1
k=k+1;
B(k)=c;
end
end
D=A(B,:);
out=randperm(k);
data=out(1:50);
x1=D(data,1:60);
x11=D(data,:);
k=0;
for h=1:208
if A(h,61)==2
k=k+1;
L(k)=h;
end
end
E=A(L,:);
out1=randperm(k);
data1=out1(1:50);
x2=E(data1,1:60);
x22=E(data1,:);
D(data,:)=[];
E(data1,:)=[];
m1=mean(x1);
m2=mean(x2);
s1=(x1-ones(50,1)*m1)'*(x1-ones(50,1)*m1);
s2=(x2-ones(50,1)*m2)'*(x2-ones(50,1)*m2);
sw=s1+s2;
w=inv(sw)*(m1-m2);
y1=w'*x1';y2=w'*x2';
m11=mean(y1,2);
m22=mean(y2,2);
th=(m11+m22)./2;
w1=0;
w2=0;
right1=0;
right2=0;
G=[D;E];
for n=1:108
xn=G(n,1:60);
xn1=G(n,:);
yn=w'*xn';
if yn>th
w1=w1+1;
if xn1(:,61)==1
right1=right1+1;
end
else
w2=w2+1;
if xn1(:,61)==2
right2=right2+1;
end
end
end
right=(right1+right2)/108;
disp(' 判定准确个数 ');
disp (right1+right2);
disp(' 判定准确率 ');
disp(right);
U=[x11;x22];
min=[inf,0];
for i=1:108
for j=1:100
d=sqrt(sum((G(i,1:60)-U(j,1:60)).^2));
if min(1)>d
min(1)=d;
min(2)=U(j,61);
end
end
end
end

Iris

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
clear all;
B=importdata('C:\Users\ASUS\Desktop\Iris.txt');
A=B.data;
Y=B.textdata;
for m=1:10
disp(sprintf(' 第%d次测试结果 ',m));
k=0;
for c=1:569
str1='M';
str3=B.textdata(c,2);
if strcmp(str1,str3)==1
k=k+1;
C(k)=c;
end
end
D=A(C,:);
DD=Y(C,:);
out=randperm(k);
data=out(1:50);
x1=D(data,1:30);
x1test=DD(data,:);
k=0;
for h=1:569
str2='B';
str3=B.textdata(h,2);
if strcmp(str3,str2)==1
k=k+1;
L(k)=h;
end
end
E=A(L,:);
EE=Y(L,:);
out1=randperm(k);
data1=out1(1:50);
x2=E(data1,1:30);
x2test=EE(data1,:);
D(data,:)=[];
DD(data,:)=[];
E(data1,:)=[];
EE(data1,:)=[];
m1=mean(x1);
m2=mean(x2);
s1=(x1-ones(50,1)*m1)*(x1-ones(50,1)*m1);
s2=(x2-ones(50,1)*m2)*(x2-ones(50,1)*m2);
sw=s1+s2;
w=inv(sw)*(m1-m2);
y1=w'*x1';y2=w'*x2';
m11=mean(y1,2);
m22=mean(y2,2);
th=(m11+m22)./2;
right1=0;
right2=0;
G=[D;E];
GG=[DD;EE];
for n=1:469
xn=G(n,1:30);
str4=GG(n,2);
yn=w'*xn';
if yn>th
if strcmp(str4,str1)==1
right1=right1+1;
end
else
if strcmp(str4,str1)==0
right2=right2+1;
end
end
end
right=(right1+right2)/469;
disp(' 判定准确个数 ');
disp (right1+right2);
disp(' 判定准确率 ');
disp(right);
U=[x1;x2];
UU=[x1test;x2test];
min=inf;
for i=1:469
for j=1:100
d=sqrt(sum((G(i,1:30)-U(j,1:30)).^2));
if min>d
min=d;
K=UU(j,2);
end
end
end
end
end

四、结果数据

soner

0.7163 0.7452 0.7452 0.7404 0.7740 0.7452 0.7692 0.7404 0.7163 0.7740

平均值 0.7466

Iris

0.9733 0.9667 0.9733 0.9733 0.9867 0.9667 0.9800 0.9800 0.9800 0.9733

平均值 0.9753