FISHER线性判别MATLAB实现

合集下载

机器学习实验1-Fisher线性分类器设计

机器学习实验1-Fisher线性分类器设计

一、实验意义及目的掌握Fisher分类原理,能够利用Matlab编程实现Fisher线性分类器设计,熟悉基于Matlab算法处理函数,并能够利用算法解决简单问题。

二、算法原理Fisher准则基本原理:找到一个最合适的投影周,使两类样本在该轴上投影之间的距离尽可能远,而每一类样本的投影尽可能紧凑,从而使分类效果为最佳。

内容:(1)尝试编写matlab程序,用Fisher线性判别方法对三维数据求最优方向w的通用函数(2)对下面表1-1样本数据中的类别w1和w2计算最优方向w(3)画出最优方向w 的直线,并标记出投影后的点在直线上的位置(4)选择决策边界,实现新样本xx1=(-0.7,0.58,0.089),xx2=(0.047,-0.4,1.04)的分类三、实验内容(1)尝试编写matlab程序,用Fisher线性判别方法对三维数据求最优方向w的通用函数程序清单:clcclear all%10*3样本数据w1=[-0.4,0.58,0.089;-0.31,0.27,-0.04;-0.38,0.055,-0.035;-0.15,0.53,0.011;-0.35,.47,0.034;0.17,0.69,0.1;-0.011,0.55,-0.18;-0.27,0.61,0.12;-0.065,0.49,0.0012;-0.12,0.054,-0.063];w2=[0.83,1.6,-0.014;1.1,1.6,0.48;-0.44,-0.41,0.32;0.047,-0.45,1.4;0.28,0.35,3.1;-0.39,-0.48,0.11;0.34,-0.079,0.14;-0.3,-0.22,2.2;1.1,1.2,-0.46;0.18,-0.11,-0.49];W1=w1';%转置下方便后面求s1W2=w2';m1=mean(w1);%对w1每一列取平均值结果为1*3矩阵m2=mean(w2);%对w1每一列取平均值结果为1*3矩阵S1=zeros(3);%有三个特征所以大小为3S2=zeros(3);for i=1:10%1到样本数量ns1=(W1(:,i)-m1)*(W1(:,i)-m1)';s2=(W2(:,i)-m2)*(W2(:,i)-m2)';S1=S1+s1;S2=S2+s2;endsw=S1+S2;w_new=transpose(inv(sw)*(m1'-m2'));%这里m1m2是行要转置下3*3 X 3*1 =3*1 这里提前转置了下跟老师ppt解法公式其实一样%绘制拟合结果数据画图用y1=w_new*W1y2=w_new*W2;m1_new=w_new*m1';%求各样本均值也就是上面y1的均值m2_new=w_new*m2';w0=(m1_new+m2_new)/2%取阈值%分类判断x=[-0.7 0.0470.58 -0.40.089 1.04 ];m=0; n=0;result1=[]; result2=[];for i=1:2%对待观测数据进行投影计算y(i)=w_new*x(:,i);if y(i)>w0m=m+1;result1(:,m)=x(:,i);elsen=n+1;result2(:,n)=x(:,i);endend%结果显示display('属于第一类的点')result1display('属于第二类的点')result2figure(1)scatter3(w1(1,:),w1(2,:),w1(3,:),'+r'),hold onscatter3(w2(1,:),w2(2,:),w2(3,:),'sg'),hold onscatter3(result1(1,:),result1(2,:),result1(3,:),'k'),hold onscatter3(result2(1,:),result2(2,:),result2(3,:),'bd')title('样本点及实验点的空间分布图')legend('样本点w1','样本点w2','属于第一类的实验点','属于第二类的实验点')figure(2)title('样本拟合结果')scatter3(y1*w_new(1),y1*w_new(2),y1*w_new(3),'b'),hold onscatter3(y2*w_new(1),y2*w_new(2),y2*w_new(3),'sr')(2)对下面表1-1样本数据中的类别w1和w2计算最优方向w(3)画出最优方向w 的直线,并标记出投影后的点在直线上的位置最优方向w 的直线投影后的位置(4)选择决策边界,实现新样本xx1=(-0.7,0.58,0.089),xx2=(0.047,-0.4,1.04)的分类决策边界取法:分类结果:四、实验感想通过这次实验,我学会了fisher线性判别相关的分类方法,对数据分类有了初步的认识,尽管在过程中有不少中间量不会算,通过查阅网络知识以及模式识别专业课ppt等课件帮助,我最终完成了实验,为今后继续深入学习打下良好基础。

【线性判别】Fisher线性判别(转)

【线性判别】Fisher线性判别(转)

【线性判别】Fisher线性判别(转)今天读paper遇到了Fisher线性判别的变体,所以来学习⼀下,所以到时候⼀定要把PRMl刷⼀遍呀在前⽂《贝叶斯决策理论》中已经提到,很多情况下,准确地估计概率密度模型并⾮易事,在特征空间维数较⾼和样本数量较少的情况下尤为如此。

实际上,模式识别的⽬的是在特征空间中设法找到两类(或多类)的分类⾯,估计概率密度函数并不是我们的⽬的。

前⽂已经提到,正态分布情况下,贝叶斯决策的最优分类⾯是线性的或者是⼆次函数形式的,本⽂则着重讨论线性情况下的⼀类判别准则——Fisher判别准则。

为了避免陷⼊复杂的概率的计算,我们直接估计判别函数式中的参数(因为我们已经知道判别函数式是线性的)。

⾸先我们来回顾⼀下线性判别函数的基本概念:应⽤统计⽅法解决模式识别问题时,⼀再碰到的问题之⼀就是维数问题。

在低维空间⾥解析上或计算上⾏得通的⽅法,在⾼维空间⾥往往⾏不通。

因此,降低维数有时就会成为处理实际问题的关键。

问题描述:如何根据实际情况找到⼀条最好的、最易于分类的投影线,这就是Fisher判别⽅法所要解决的基本问题。

考虑把d维空间的样本投影到⼀条直线上,形成⼀维空间,即把维数压缩到⼀维。

然⽽,即使样本在d维空间⾥形成若⼲紧凑的互相分得开的集群,当把它们投影到⼀条直线上时,也可能会是⼏类样本混在⼀起⽽变得⽆法识别。

但是,在⼀般情况下,总可以找到某个⽅向,使在这个⽅向的直线上,样本的投影能分得开。

下图可能会更加直观⼀点:从d维空间到⼀维空间的⼀般数学变换⽅法:假设有⼀集合Г包含N个d维样本x1, x2, …, xN,其中N1个属于ω1类的样本记为⼦集Г1, N2个属于ω2类的样本记为⼦集Г2 。

若对xn的分量做线性组合可得标量:yn = wTxn, n=1,2,…,N这样便得到N个⼀维样本yn组成的集合,并可分为两个⼦集Г1’和Г2’ 。

实际上,w的值是⽆关紧要的,它仅是yn乘上⼀个⽐例因⼦,重要的是选择w的⽅向。

简单的利用Fisher准则函数获取最佳投影线的Matlab程序

简单的利用Fisher准则函数获取最佳投影线的Matlab程序

简单的利用Fisher准则函数获取最佳投影线的Matlab程序发现利用Fisher准则函数计算最佳投影方向的公式好像很简单,就写这个吧!这个Fisher法就是将高维空间中的样本投影到一维空间中,以降低复杂度。

具体可以参见边肇祺、张学工著,清华大学出版社的《模式识别》(第二版)P87。

用这种方法时使用到了几个概念:样本向量:样本向量是列向量,样本是d维空间中的点,因此它的位置可以用一个d维列向量表示;各类样本均值向量:一类中所有样本向量的均值,也是d维列向量;样本类内离散度矩阵:x为样本向量,m i为C i类的均值向量,S i为C i类的类内离散度矩阵。

总类内离散度矩阵:S w=S1+S2;利用Lagrange乘子法可以求出使Fisher准则函数取极大值的向量:这个向量指出了相对于Fisher准则函数最好的投影线方向。

虽然推导出这个结果,破费了些周折,但是结果的形式还是相对比较简单的,所以用Matlab程序实现它应该不麻烦。

最终的这个向量仅与总类内离散度矩阵和各类的均值向量有关,我们可以对类内离散度矩阵的表达式变一下形,使程序更容易写:这样的变形也许在数学上的意义不大,但是可以简化程序,使得类内离散度矩阵仅用一次矩阵乘法就可完成。

以下程序在Matlab7.0.1下编写。

在编写求解最佳投影线方向的代码之前,先得编写生成样本的函数,如下(为这个函数取名困扰了我很久,最后查字典得知样本是swatch,所以这个函数命名为createSwatch):function swatch=createSwatch(xmin,xmax,ymin,ymax,num,varargin)xlen=abs(xmax-xmin);ylen=abs(ymax-ymin);if numel(varargin)>0 && isa(varargin{1},'function_handle')f=varargin{1};elsef=@rand;endswatch=[xlen*f(1,num)+min(xmax,xmin);...ylen*f(1,num)+min(ymax,ymin)];这次的实验是针对2D空间的样本,所以这个createSwatch函数用来产生2D空间的样本点。

Fisher线性分类器通俗解释及MATLAB、Python实现

Fisher线性分类器通俗解释及MATLAB、Python实现

Fisher线性分类器通俗解释及MATLAB、Python实现⼀、通俗的解释:问题提出:还是以iris的数据为例,有A、B、C三种花,每⼀类的特征都⽤4维特征向量表⽰。

现在已知⼀个特征向量,要求对应的类别,⽽我们⼈可以直接通过眼睛看⽽作出分类的是在⼀维⼆维三维空间,⽽不适应这样的四维数据。

启⽰:假设有这样的⼀个⽅向向量,其与特征向量进⾏内积运算(即向⽅向向量的投影)后,结果为⼀个数值,若同类的特征向量投影后聚集在⼀起,不同类的特征投影后相对分散,那么,我们的⽬的就达到了。

⽬标:这样就有了⽅向,即要寻找⼀个独特的⽅向,使其达到我们的要求。

注:具体的推导过程,参看教科书,另外,在求解极值的时候,利⽤了矩阵论中的向量导数运算。

⼆、MATLAB程序:clearA=[5.1,3.5,1.4,0.24.9,3.0,1.4,0.24.7,3.2,1.3,0.24.6,3.1,1.5,0.25.0,3.6,1.4,0.25.4,3.9,1.7,0.44.6,3.4,1.4,0.35.0,3.4,1.5,0.24.4,2.9,1.4,0.24.9,3.1,1.5,0.15.4,3.7,1.5,0.24.8,3.4,1.6,0.24.8,3.0,1.4,0.14.3,3.0,1.1,0.15.8,4.0,1.2,0.25.7,4.4,1.5,0.45.4,3.9,1.3,0.45.1,3.5,1.4,0.35.7,3.8,1.7,0.35.1,3.8,1.5,0.35.4,3.4,1.7,0.25.2,4.1,1.5,0.15.5,4.2,1.4,0.24.9,3.1,1.5,0.15.0,3.2,1.2,0.25.5,3.5,1.3,0.24.4,3.2,1.3,0.25.0,3.5,1.6,0.6 5.1,3.8,1.9,0.44.8,3.0,1.4,0.35.1,3.8,1.6,0.24.6,3.2,1.4,0.25.3,3.7,1.5,0.2 5.0,3.3,1.4,0.2 7.0,3.2,4.7,1.4];B=[6.4,3.2,4.5,1.5 6.9,3.1,4.9,1.55.5,2.3,4.0,1.36.5,2.8,4.6,1.55.7,2.8,4.5,1.36.3,3.3,4.7,1.6 4.9,2.4,3.3,1.0 6.6,2.9,4.6,1.3 5.2,2.7,3.9,1.4 5.0,2.0,3.5,1.05.9,3.0,4.2,1.56.0,2.2,4.0,1.0 6.1,2.9,4.7,1.45.6,2.9,3.6,1.36.7,3.1,4.4,1.4 5.6,3.0,4.5,1.55.8,2.7,4.1,1.06.2,2.2,4.5,1.5 5.6,2.5,3.9,1.15.9,3.2,4.8,1.86.1,2.8,4.0,1.3 6.3,2.5,4.9,1.5 6.1,2.8,4.7,1.25.5,2.4,3.8,1.1 5.5,2.4,3.7,1.05.8,2.7,3.9,1.26.0,2.7,5.1,1.65.4,3.0,4.5,1.56.0,3.4,4.5,1.6 6.7,3.1,4.7,1.5 6.3,2.3,4.4,1.3 5.6,3.0,4.1,1.3 5.5,2.5,4.0,1.35.5,2.6,4.4,1.26.1,3.0,4.6,1.4 5.8,2.6,4.0,1.2 5.0,2.3,3.3,1.0 5.6,2.7,4.2,1.3 5.7,3.0,4.2,1.25.7,2.9,4.2,1.36.2,2.9,4.3,1.3 5.1,2.5,3.0,1.1 5.7,2.8,4.1,1.3];C=[6.3,3.3,6.0,2.5 5.8,2.7,5.1,1.9 7.1,3.0,5.9,2.1 6.3,2.9,5.6,1.86.5,3.0,5.8,2.27.6,3.0,6.6,2.1 4.9,2.5,4.5,1.7 7.3,2.9,6.3,1.86.7,2.5,5.8,1.87.2,3.6,6.1,2.5 6.5,3.2,5.1,2.0 6.4,2.7,5.3,1.97.7,2.6,6.9,2.36.0,2.2,5.0,1.56.9,3.2,5.7,2.35.6,2.8,4.9,2.07.7,2.8,6.7,2.06.3,3.4,5.6,2.46.4,3.1,5.5,1.86.0,3.0,4.8,1.86.9,3.1,5.4,2.16.7,3.1,5.6,2.46.9,3.1,5.1,2.35.8,2.7,5.1,1.96.8,3.2,5.9,2.36.7,3.3,5.7,2.56.7,3.0,5.2,2.36.3,2.5,5.0,1.96.5,3.0,5.2,2.06.2,3.4,5.4,2.35.9,3.0,5.1,1.8];%⽅法⼀:先将A作为⼀类,BC作为⼀类NA=size(A,1);NB=size(B,1);NC=size(C,1);A_train=A(1:floor(NA/2),:);%训练数据取1/2(或者1/3,3/4,1/4)B_train=B(1:floor(NB/2),:);C_train=C(1:floor(NC/2),:);A_test=A((floor(NA/2)+1):end,:);B_test=B((floor(NB/2)+1):end,:);C_test=C((floor(NC/2)+1):end,:);A_train=A_train;D_train=[B_train;C_train];A_test=A_test;D_test=[B_test;C_test];for i=1:size(A_train,1)S1=S1+(A_train(i,:)-u1)'*(A_train(i,:)-u1);endfor i=1:size(D_train,1)S2=S2+(D_train(i,:)-u2)'*(D_train(i,:)-u2);endSw=S1+S2;w1=(inv(Sw)*(u1-u2)')';w1=w1./norm(w1);y0=w1*(u1+u2)'/2;% a1=w*u1'% d1=w*u2'r1=0;for i=1:size(D_test,1)if w1*D_test(i,:)'<y0r1=r1+1;endendrate_D=r1/size(D_test,1)r2=0;for i=1:size(A_test,1)if w1*A_test(i,:)'>y0r2=r2+1;endendrate_A=r2/size(A_test,1)三、Python程序:from sklearn import discriminant_analysisfrom sklearn.model_selection import train_test_splitimport numpydata = numpy.genfromtxt('iris.csv', delimiter=',', usecols=(0,1,2,3)) target = numpy.genfromtxt('iris.csv', delimiter=',', usecols=(4), dtype=str) t = numpy.zeros(len(target))t[target == 'setosa'] = 1t[target == 'versicolor'] = 2t[target == 'virginica'] = 3#print(clf.predict([data[3]]))。

判别分析及MATLAB实现

判别分析及MATLAB实现

d(x, G) (x )T 1(x )
为n维向量x与总体G的马氏距离.
(4.1.2)
MATLAB中有一个命令:d=mahal(Y,X),计算X 矩阵每一个点(行)至Y矩阵中每一个点(行)的 马氏距离。其中Y的列数必须等于X的列数,但它们 的行数可以不同。X的行数必须大于列数。输出d是 距离向量。
af=[1.24,1.72;1.36,1.74;1.38,1.64;1.38,1.82;1.38,1.90;1.40,1.70;
1.48,1.82;1.54,1.82;1.56,2.08];
x=[1.24,1.8;1.28,1.84; 1.4,2.04];
% 输入原始数据
m1=mean(apf); m2=mean(af);
第8页/共57页
(3) 两个总体之间的马氏距离 设有两个总体G1,G2,两个总体的均值向量分别
为 1 , 2,协方差矩阵相等,皆为Σ,则两个总体之
间的马氏距离为
d (G1, G2 ) (1 2 )T 1(1 2 ) (4.1.3)
通常,在判别分析时不采用欧氏距离的原因在 于,该距离与量纲有关.例如平面上有A,B,C,D四个 点,横坐标为代表重量(单位:kg),纵坐标代表 长度(单位:cm),如下页图。
上述公式可以化简为: W(x)=(ma-mb)S-1(x-(ma+mb)/2)’
若W(x)>0,x属于G1;若W(x)<0,x属于G2 注意: 1.此处ma,mb都是行向量; 2.当x是一个矩阵时,则用ones矩阵左乘(ma+mb)/2以 后,方可与x相减.
第16页/共57页
※ Matlab中直接进行数据的判别分析命令为classify, 其调用格式 class = classify(sample,training,group, 'type')

FISHER线性判别MATLAB实现

FISHER线性判别MATLAB实现

Fisher 线性判别上机实验报告班级: 学号: 姓名:一.算法描述Fisher 线性判别分析的基本思想:选择一个投影方向(线性变换,线性组合),将高维问题降低到一维问题来解决,同时变换后的一维数据满足每一类内部的样本尽可能聚集在一起,不同类的样本相隔尽可能地远。

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

线性判别函数的一般形式可表示成0)(w X W X g T += 其中Fisher 选择投影方向W 的原则,即使原样本向量在该方向上的投影能兼顾类间分布尽可能分开,类内样本投影尽可能密集的要求。

如下为具体步骤:(1)W 的确定w S 样本类间离散度矩阵b在投影后的一维空间中,各类样本均值Tiim '= Wm样本类内离散度和总类内离散度 T Ti i ww S ' = W S W S ' = W S W 样本类间离散度Tbb S ' = W S W Fisher 准则函数为 max 2221221~~)~~()(S S m m W J F +-=(2)阈值的确定w 0是个常数,称为阈值权,对于两类问题的线性分类器可以采用下属决策规则: 令)()()(21x 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 判别准则下的最优投影方向。

判别分析公式Fisher线性判别二次判别

判别分析公式Fisher线性判别二次判别

判别分析公式Fisher线性判别二次判别判别分析是一种常用的数据分析方法,用于根据已知的类别信息,将样本数据划分到不同的类别中。

Fisher线性判别和二次判别是两种常见的判别分析方法,在实际应用中具有广泛的应用价值。

一、Fisher线性判别Fisher线性判别是一种基于线性变换的判别分析方法,该方法通过寻找一个合适的投影方向,将样本数据投影到一条直线上,在保持类别间离散度最大和类别内离散度最小的原则下实现判别。

其判别函数的计算公式如下:Fisher(x) = W^T * x其中,Fisher(x)表示Fisher判别函数,W表示投影方向的权重向量,x表示样本数据。

具体来说,Fisher线性判别的步骤如下:1. 计算类别内离散度矩阵Sw和类别间离散度矩阵Sb;2. 计算Fisher准则函数J(W),即J(W) = W^T * Sb * W / (W^T * Sw * W);3. 求解Fisher准则函数的最大值对应的投影方向W;4. 将样本数据投影到求得的最优投影方向上。

二、二次判别二次判别是基于高斯分布的判别分析方法,将样本数据当作高斯分布的观测值,通过估计每个类别的均值向量和协方差矩阵,计算样本数据属于每个类别的概率,并根据概率大小进行判别。

二次判别的判别函数的计算公式如下:Quadratic(x) = log(P(Ck)) - 0.5 * (x - μk)^T * Σk^-1 * (x - μk)其中,Quadratic(x)表示二次判别函数,P(Ck)表示类别Ck的先验概率,x表示样本数据,μk表示类别Ck的均值向量,Σk表示类别Ck的协方差矩阵。

具体来说,二次判别的步骤如下:1. 估计每个类别的均值向量μk和协方差矩阵Σk;2. 计算每个类别的先验概率P(Ck);3. 计算判别函数Quadratic(x);4. 将样本数据划分到概率最大的类别中。

判别分析公式Fisher线性判别和二次判别是常见的判别分析方法,它们通过对样本数据的投影或概率计算,实现对样本数据的判别。

fisher算法及其matlab实现

fisher算法及其matlab实现

Fisher判别法讲解以及matlab代码实现两类的线形判别问题可以看作是把所有样本都投影到一个方向上,然后在这个一维空间中确定一个分类的阈值。

过这个预置点且与投影方向垂直的超平面就是两类的分类面。

第一个问题,如何确定投影方向?这里只讨论两类分类的问题.训练样本集是X={x1,x2...xn},每个样本是一个d维向量,其中第一类w1={ X i,x2 ... x ii},第二类w2={ x i ,x2 ... x?2 }。

我们要寻求一个投影方向w(w也是一个d维向量),投影以后样本变成:y i = W T X i(y 是一个标量),i=1...n在原样本空间中,类均值为:1m i —X j n i x j w ii=1,2(一共两类的均值)(ps.m i是一个d*1的矩阵,假设每个维度是一个变量值,mi中的每一维度就是这些变量值的均值,如下图所示:特别注明:有些例子给的矩阵是这样的:fisher算法公式的时候就会发现最后得到的矩阵维数不对。

定义各类类内的离散度矩阵为:(类内离散度矩阵其实就是类协方差矩阵,类在多于一个样本,且样本维度>1时是一个矩阵)S (X j m i)(X j mJ TX j w i(因为,Xj是一个d*1的矩阵,也可称作d维向量,m也是一个d*1的矩阵, 所以最后得到的S一定是一个d*d的矩阵)(在用matlab计算的时候直接用cov(wi)即可得到想要的协方差矩阵,故直接计算不探究细节时图2可直接cov算协方差,不用根据公式转置来转置去,不过matlab中算的协方差被缩小了(n 1-1)倍,计算时i=cov(w1)* (n 1-1))总的类内离散度矩阵:S w类间离散度矩阵定义为:S b (m i m 2)(m 1在投影以后的一维空间里,两类的均值分别是;将公式代入并通过拉格朗日求极值的方法,可得 投影方向:m iiNi y j w iy i丄N i xTw x jwTw m ii=1,2故类内离散度不再是一个矩阵,而是一个值S i(y i mJ 2y j W ii=1,2总类内离散度为:SwwS11S11类间离散度:(m ii mu)2要使得需求的方向投影能在投影后两类能尽可能的分开, 聚集,可表示成如下准则,即fisher 准则: 而各类内部又尽可能的max J (w)Sbb1w S w (m mJ(w是一个d*1的矩阵,或者说亦是一个d维向量)阈值可表示为:W。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 21Fisher 选择投影方向W 的原则,即使原样本向量在该方向上的投影能兼顾类间分布尽可能分开,类内样本投影尽可能密集的要求。

如下为具体步骤:(1)W 的确定样本类内离散度矩阵i和总类内离散度矩阵w S12w S S S =+Tx S (x m )(x m ), 1,2ii i i X i ∈=--=∑样本类间离散度矩阵b S在投影后的一维空间中,各类样本均值Tiim '= Wm样本类内离散度和总类内离散度 T Ti i ww S ' = W S W S ' = W S W 样本类间离散度Tb b S ' = W S WFisher 准则函数为 max 2221221~~)~~()(S S m mW J F +-=(2)阈值的确定w 0是个常数,称为阈值权,对于两类问题的线性分类器可以采用下属决策规则: 令)()()(21x 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 判别准则下的最优投影方向。

最后得到决策规则若P P m m w ww x x g T)()(2112log))(21()(大于或小于+-=,则{12w w x ∈ T1212S (m m )(m m )b =--对于某一个未知类别的样本向量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)代码:clccleardata=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:30s1 = s1 + (Iris1(i,:) - m1)'*(Iris1(i,:) - m1);endfor i=1:1:30s2 = s2 + (Iris2(i,:) - m2)'*(Iris2(i,:) - m2); endfor i=1:1:30s3 = 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:50x = 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];endendfor i=31:50x = 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];endendfor i=31:50x = 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];endendcorrect=(kind1+kind2+kind3)/60;fprintf('\n综合正确率:%.2f%%\n\n',correct* 100); (2)实验结果:综合正确率=96.67%2.Sonar(1)代码:clccleardata=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:70s1 = s1 + (Sonar1(i,:) - m1)'*(Sonar1(i,:) - m1); endfor i=1:1:80s2 = 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:98x = Sonar1(i,:);g12 = w12 * x' + T12;if g12 > 0newsonar1=[newsonar1;x];kind1=kind1+1;elsenewsonar2=[newsonar2;x];endendfor i=81:110x = Sonar2(i,:);g12 = w12 * x' + T12;if g12 > 0newsonar1=[newsonar1;x];elsenewsonar2=[newsonar2;x];kind2=kind2+1;endendcorrect= (kind1+kind2)/58;fprintf('\n综合正确率:%.2f%%\n\n',correct*100); (2)实验结果:综合正确率=75.86%。

相关文档
最新文档