FISHER线性判别MATLAB实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 的确定
样本类间离散度矩阵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
212
21
~~)~~()(S S m m W J F +-=
(2)阈值的确定
w 0
就是个常数,称为阈值权,对于两类问题的线性分类器可以采用下属决策规
则:
令)
()()(2
1
x 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 :-1
w 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;