線性判別分析(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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章