FISHER线性判别MATLAB实现

更新时间:2023-04-13 00:31:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

. Fisher线性判别上机实验报告

班级:

学号:

姓名:

.

一.算法描述

Fisher 线性判别分析的基本思想:选择一个投影方向(线性变换,线性组合),将高维问题降低到一维问题来解决,同时变换后的一维数据满足每一类内部的样本尽可能聚集在一起,不同类的样本相隔尽可能地远。

Fisher 线性判别分析,就是通过给定的训练数据,确定投影方向W 和阈值w0, 即确定线性判别函数,然后根据这个线性判别函数,对测试数据进行测试,得到测试数据的类别。

线性判别函数的一般形式可表示成0)(w X W X g T += 其中

????? ??=d x x X Λ1 ??????

? ??=d w w w W Λ21

Fisher 选择投影方向W 的原则,即使原样本向量在该方向上的投影能兼顾类间分布尽可能分开,类内样本投影尽可能密集的要求。 如下为具体步骤:

(1)W 的确定

i w S

T x S (x m )(x m ), 1,2i i i i X i ∈=

--=∑

.

12w S S S =+

样本类间离散度矩阵b S

在投影后的一维空间中,各类样本均值T i i m '= W m

样本类内离散度和总类内离散度 T T i i w

w S ' = W S W S ' = W S W 样本类间离散度T b

b S ' = W S W Fisher 准则函数为 max 22

2122

1~~)~~()(S S m m W J F +-= (2)阈值的确定

w 0

是个常数,称为阈值权,对于两类问题的线性分类器可以采用下属决策规则: 令)()()(2

1x x x g g g -=则:

如果g(x)>0,则决策w x 1∈;如果g(x)<0,则决策w x 2∈;如果g(x)=0,则可将x 任意分到某一类,或拒绝。

(3)Fisher 线性判别的决策规则

Fisher 准则函数满足两个性质:

1.投影后,各类样本内部尽可能密集,即总类内离散度越小越好。

2.投影后,各类样本尽可能离得远,即样本类间离散度越大越好。

根据这个性质确定准则函数,根据使准则函数取得最大值,可求出

W :-1w 12W = S (m - m ) 。

这就是Fisher 判别准则下的最优投影方向。

最后得到决策规则 T

1212S (m m )(m m )b =--

.

P

P

m

m

w

w

w

x

x

g T

)

(

)

(

2

1

1

2

log

))

(

2

1

(

)

(大于或小于

+

-

=

,则

{1

2

w

w

x∈

对于某一个未知类别的样本向量x,如果y=W T·x>y0,则x∈w1;否则x ∈w2。

二.数据描述

1.iris数据

IRIS数据集以鸢尾花的特征作为数据来源,数据集包含150个数据集,有4维,分为3 类,每类50个数据,每个数据包含4个属性,是在数据挖掘、数据分类中非常常用的测试集、训练集。

2.sonar数据

Sonar数据集包含208个数据集,有60维,分为2类,第一类为98个数据,第二类为110个数据,每个数据包含60个属性,是在数据挖掘、数据分类中非常常用的测试集、训练集。

三.实验结果以及源代码

1.Iris

(1)代码:

clc

clear

data=xlsread('Iris');

Iris1=data(1:50,1:4);

Iris2=data(51:100,1:4);

Iris3=data(101:150,1:4);

. %类均值向量

m1 = mean(Iris1);

m2 = mean(Iris2);

m3 = mean(Iris3);

%各类内离散度矩阵

s1 = zeros(4);

s2 = zeros(4);

s3 = zeros(4);

for i=1:1:30

s1 = s1 + (Iris1(i,:) - m1)'*(Iris1(i,:) - m1);

end

for i=1:1:30

s2 = s2 + (Iris2(i,:) - m2)'*(Iris2(i,:) - m2);

end

for i=1:1:30

s3 = s3 + (Iris3(i,:) - m3)'*(Iris3(i,:) - m3);

end

%总类内离散矩阵

sw12 = s1 + s2;

sw13 = s1 + s3;

sw23 = s2 + s3;

. %投影方向

w12 = ((sw12^-1)*(m1 - m2)')';

w13 = ((sw13^-1)*(m1 - m3)')';

w23 = ((sw23^-1)*(m2 - m3)')';

%判别函数以及阈值T(即w0)

T12 = -0.5 * (m1 + m2)*inv(sw12)*(m1 - m2)';

T13 = -0.5 * (m1 + m3)*inv(sw13)*(m1 - m3)';

T23 = -0.5 * (m2 + m3)*inv(sw23)*(m2 - m3)';

kind1 = 0;

kind2 = 0;

kind3 = 0;

newiris1=[];

newiris2=[];

newiris3=[];

for i=31:50

x = Iris1(i,:);

g12 = w12 * x' + T12;

g13 = w13 * x' + T13;

g23 = w23 * x' + T23;

if((g12 > 0)&(g13 > 0))

newiris1=[newiris1;x];

kind1=kind1+1;

.

elseif((g12 < 0)&(g23 > 0))

newiris2=[newiris2;x];

elseif((g13 < 0)&(g23 < 0))

newiris3=[newiris3;x];

end

end

for i=31:50

x = Iris2(i,:);

g12 = w12 * x' + T12;

g13 = w13 * x' + T13;

g23 = w23 * x' + T23;

if((g12 > 0)&(g13 > 0))

newiris1=[newiris1;x];

elseif((g12 < 0)&(g23 > 0))

kind2=kind2+1;

newiris2=[newiris2;x];

elseif((g13 < 0)&(g23 < 0))

newiris3=[newiris3;x];

end

end

for i=31:50

x = Iris3(i,:);

g12 = w12 * x' + T12;

.

g13 = w13 * x' + T13;

g23 = w23 * x' + T23;

if((g12 > 0)&(g13 > 0))

newiris1=[newiris1;x];

elseif((g12 < 0)&(g23 > 0))

newiris2=[newiris2;x];

elseif((g13 < 0)&(g23 < 0))

kind3=kind3+1;

newiris3=[newiris3;x];

end

end

correct=(kind1+kind2+kind3)/60;

fprintf('\n综合正确率:%.2f%%\n\n',correct* 100);

(2)实验结果:

综合正确率=96.67%

2.Sonar

(1)代码:

clc

clear

data=xlsread('sonar');

Sonar1=data(1:98,1:60);

Sonar2=data(99:208,1:60);

%类均值向量

. m1 = mean(Sonar1);

m2 = mean(Sonar2);

%各类内离散度矩阵

s1 = zeros(60);

s2 = zeros(60);

for i=1:1:70

s1 = s1 + (Sonar1(i,:) - m1)'*(Sonar1(i,:) - m1);

end

for i=1:1:80

s2 = s2 + (Sonar2(i,:) - m2)'*(Sonar2(i,:) - m2);

end

%总类内离散矩阵

sw12 = s1 + s2;

%投影方向

w12 = ((sw12^-1)*(m1 - m2)')';

%判别函数以及阈值T(即w0)

T12 = -0.5 * (m1 + m2)*inv(sw12)*(m1 - m2)';

kind1 =0;

kind2 =0;

. newsonar1=[];

newsonar2=[];

for i=71:98

x = Sonar1(i,:);

g12 = w12 * x' + T12;

if g12 > 0

newsonar1=[newsonar1;x];

kind1=kind1+1;

else

newsonar2=[newsonar2;x];

end

end

for i=81:110

x = Sonar2(i,:);

g12 = w12 * x' + T12;

if g12 > 0

newsonar1=[newsonar1;x];

else

newsonar2=[newsonar2;x];

kind2=kind2+1;

end

end

correct= (kind1+kind2)/58;

. fprintf('\n综合正确率:%.2f%%\n\n',correct*100);

(2)实验结果:

综合正确率=75.86%

本文来源:https://www.bwwdw.com/article/k66l.html

Top