线性判别分析(Linear Discriminant Analysis ,简称LDA)

线性判别分析(Linear Discriminant Analysis ,简称LDA)是一种经典的线性学习方法,在二分类问题上最早由【Fisher,1936】提出,也称为“Fisher 判别分析”
LDA的思想:给定训练样本例集,设法将例投影在一条直线上,使得同类例的投影点近可能近,异类样例尽可能地远离;在对新样本进行分类时,将其投影到同样的这条直线上,再根据投影点的位置来确定新样本的类别。如下图所示:
这里写图片描述
欲使同类例的投影点尽可能近,可以让同类例投影点的协方差尽可能小,而欲使异类样例投影点尽可能远可以让类中心之间的距离尽可能的大,同时考虑可得欲最大化的目标:
这里写图片描述
定义“类内散度矩阵”
这里写图片描述
“类间散度矩阵”
这里写图片描述
则最大化目标可写为:
这里写图片描述
其中u为数据的均值,这就是LDA欲最大化得目标。

matlab代码如下:

%%%%%%%%%%%%%%%%%%%%%%%%
%LDA线性判别式分析算法
%%%%%%%%%%%%%%%%%%%%%%%
clc;clear;
 x1=[4,2;2,4;2,3;3,6;4,4];
 x2=[9,10;6,8;9,5;8,7;10,8];

figure(1)
plot(x1(:,1),x1(:,2),'b*');
hold on;
plot(x2(:,1),x2(:,2),'ro');
title('数据分布');

u1=mean(x1)';%均值
u2=mean(x2)';%均值
s1=cov(x1);%协方差矩阵
s2=cov(x2);%协方差矩阵
%类内散度矩阵
sw=s1+s2;
%类间散度矩阵
sb=(u1-u2)*(u1-u2)';
invSw=inv(sw);
invSw_by_SB=invSw*sb;
%求最大特征值和特征向量
[V,D]=eig(invSw_by_SB);
[a,b]=max(max(D));
W=V(:,b);
k=W(2)/W(1);
%%%%%%%%训练后的数据
new_x1=x1*W;
new_x2=x2*W;

figure(2)
X1=0:0.1:10;
Y1=k.*X1;
plot(x1(:,1),x1(:,2),'b*');
hold on;
plot(x2(:,1),x2(:,2),'ro');
plot(X1,Y1);
%%%画投影
Xt1=(x1(:,1)+k.*x1(:,2))/(k*k+1);
Yt1=k.*Xt1;
Xt2=(x2(:,1)+k.*x2(:,2))/(k*k+1);
Yt2=k.*Xt2;
plot(Xt1,Yt1,'vc');
plot(Xt2,Yt2,'vc');
hold off;
grid on;

prediction=[7 3.46];
result=prediction*W;
T=new_x1-result;
T1=new_x2-result;
if(min(abs(T1))>min(abs(T)))
    disp('1');
else
    disp('2');
end

猜你喜欢

转载自blog.csdn.net/u011835903/article/details/77701753
今日推荐