资讯详情

【老生谈算法】matlab实现Fisher判别算法源码——Fisher算法

Fisher解释判别法和matlab代码实现


1、文档下载:

本算法已整理成文档如下。有需要的朋友可以点击下载

序号 文档(点击下载)
本项目文档 【老生谈算法】fisher算法及其matlab实现.docx

2、算法详解:

两种类型的线性识别问题可以看作是将所有样本投影到一个方向,然后在这个一维空间中确定分类阈值。通过这个预置点并垂直于投影方向的超平面是两种类型的分类表面。

第一个问题是如何确定投影方向? 这里只讨论两类分类的问题.训练样本集是X={x1,x2…xn},每个样本都是d维向量,其中第一类w1={,…},第二类w2={,…}。我们想要一个投影方向w(w也是d维向量),投影后样本变成:=(y是标量),i=1…n 类均值为:

在这里插入图片描述

              图1 

特别注意:有些例子给出的矩阵是这样的:

                      图2 

这里的单个样本是1*d计算时注意转移矩阵,否则应用fisher当算法公式发现矩阵维数错误时。

各类离散度矩阵的定义为:(类内离散度矩阵实际上是类协方差矩阵,类多于样本,样本维度>1时为矩阵)

(因为,是一个d1矩阵,也称为d维向量,也是一个d1矩阵,所以最后得到的一定是一个dd的矩阵) (在用matlab直接用于计算cov(wi)您可以获得所需的协方差矩阵,因此可以直接计算不探索细节的图2cov计算协方差,不需要按公式转移,但是matlab计算协方差缩小(n1-1)倍,计算时S=cov(w1)(n1-1)) 总类内离散度矩阵:

类间离散度矩阵定义为:

在投影后的一维空间中,两类均值分别为;

因此,内离散度不再是矩阵,而是值

总类内离散度为:

类间离散:

为了使需求方向投影在投影后尽可能分离,各种内部尽可能聚集,可以表示为以下标准,即fisher准则:

投影方向可以通过拉格朗日求极值来代入公式:

(w是一个d*1矩阵,或d维向量) 阈值可以表示为:

最后,将确定样本代替

判断g(x)符号与哪一类相同,确定属于哪一类。

例子(注意表格中给出的样本维度和公式中的变量维度)

代码运行正确

代码:

%读取excel中特定单元格的数据 w12=xlsread('E:\模式识别\理论学习\胃病分类问题.xls','C2:F16'); %分别选取类1和类2、测试样本的数据 w1=w12(1:5,:); w2=w12(6:12,:); sample=w12(13:15,:); %计算类1和类2的样本数 r1=size(w1,1); r2=size(w2,1); r3=size(sample,1); %计算类1和类2的均值(矩阵) m1=mean(w1); m2=mean(w2); %各类类内离散度矩阵(协方差矩阵) s1=cov(w1)*(r1-1); s2=cov(w2)*(r2-1); %总类内离散度矩阵 sw=s1+s2; %投影向量的计算公式 w=inv(sw)*(m1-m2)'; %计算投影后的一位空间内,各类的均值 y1=w'*m1'; y2=w'*m2'; %计算阈值 w0=-1/2*(y1+y2); %和类相同符号被归为同类 for i=1:r3 y(i)=sample(i,:)*w+w0; if y(i)*(w'*w1(1,:)'+w0)>0 y(i)=1; else y(i)=2; end End 

判断得出第一个待测样本属于类1,第二,三个待测样本属于类2

如果想进一步知道样本矩阵是如何转置得到最后结果的,可看下面这个例子,这个例子没有用到matlab内置的cov协方差函数(用cov可以直接用样本数据直接进行矩阵运算,不用转置成样本维度向量),所以要进行转置后代入fisher准则公式求解.

x=xlsread('E:\模式识别\理论学习\污染水域问题.xls','C3:F14');
x1=x(1:5,:)';
x2=x(6:10,:)';
sample=x(11:12,:)';
m1=zeros(size(x1,1),1);
% 求类内离散度矩阵
m1=mean(x1,2)
m2=mean(x2,2)
% 求类内离散度矩阵
s1=zeros(size(x1,1),size(x1,1));
for i=1:size(x1,2)
s1=s1+(x1(:,i)-m1)*(x1(:,i)-m1)';
end
s2=zeros(size(x2,1),size(x2,1));
for i=1:size(x2,2)
s2=s2+(x2(:,i)-m2)*(x2(:,i)-m2)';
end
sw=s1+s2;
w=inv(sw)*(m1-m2);
y1=w'*m1;
y2=w'*m2;
w0=-1/2*(y1+y2);
for i=1:size(sample,2)
    y(i)=w'*sample(:,i);
    if y(i)+w0>0
        y(i)=1;
    else
        y(i)=2;
    end
end
 

标签: 5w12v直插二极管sick小型光电传感器w12g

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司