LDA(线性判别分析)详解 —— matlab
目錄
前言
正題
1.LDA的思想
2. 瑞利商(Rayleigh quotient)與廣義瑞利商(genralized Rayleigh quotient)?
3. 二類LDA原理
4.多類LDA原理
5.LDA分類
6.LDA算法流程
二類LDA matlab舉例:
1.讀取數據集
2.分離數據集
3.求解w
4.輸出降維后的數據集
5.分類
?
前言
????????在主成分和因子分析中,我們對降維算法做了總結。這里我們就對另外一種經典的降維方法線性判別分析(Linear Discriminant Analysis, 以下簡稱LDA)做一個總結。LDA在模式識別領域(比如人臉識別,艦艇識別等圖形圖像識別領域)中有非常廣泛的應用,因此我們有必要了解下它的算法原理。
在學習LDA之前,有必要將其自然語言處理領域的LDA區別開來,在自然語言處理領域, LDA是隱含狄利克雷分布(Latent Dirichlet Allocation,簡稱LDA),他是一種處理文檔的主題模型。我們本文只討論線性判別分析,因此后面所有的LDA均指線性判別分析。
在做具體解釋之前,請允許我放上我之前的一些鏈接:
主成分分析 —— matlab :傳送門
主成分分析 —— python :傳送門
因子分析 —— matlab :傳送門
因子分析 —— python :傳送門
正題
1.LDA的思想
? ? ? ? 線性判別分析((Linear Discriminant Analysis?,簡稱 LDA)是一種經典的線性學習方法,在二分類問題上因為最早由 [Fisher,1936] 提出,亦稱 ”Fisher 判別分析“。并且LDA也是一種監督學習的降維技術,也就是說它的數據集的每個樣本都有類別輸出。這點與主成分和因子分析不同,因為它們是不考慮樣本類別的無監督降維技術。
????????LDA 的思想非常樸素:給定訓練樣例集,設法將樣例投影到一條直線上,使得同樣樣例的投影盡可能接近、異樣樣例的投影點盡可能遠離;在對新樣本進行分類時,將其投影到同樣的這條直線上,再根據投影點的位置來確定新樣本的類別。其實可以用一句話概括:就是“投影后類內方差最小,類間方差最大”。
圖為 LDA的二維示意圖。”+“,”-“分別代表正側和反側,橢圓表示數據簇的外輪廓,虛線表示投影,紅色實心圓和實心三角形分別表示兩類樣本投影后的中心點。
2. 瑞利商(Rayleigh quotient)與廣義瑞利商(genralized Rayleigh quotient)?
? ? ? ? 我們先來看一下瑞麗商的定義。
? ? ? ? 瑞麗商是指這樣的函數R(A,x):
? ? ? ? 其中x為非零向量,而A為 n*n 的Hermitan矩陣。所謂的Hermitan矩陣就是滿足共軛轉置矩陣和自己相等的矩陣,即?.?如果我們的矩陣A是實矩陣,則滿足的矩陣即為Hermitan矩陣。
????????瑞利商R(A,x)有一個非常重要的性質,即它的最大值等于矩陣A最大的特征值,而最小值等于矩陣A的最小的特征值,也就是滿足
? ? ? ? 至于證明過程就不在這里介紹了。當向量x是標準正交基時,即滿足時,瑞利商退化為:,這個形式在譜聚類和PCA中都有出現。
以上就是瑞麗商的內容。
? ? ? ? 下面我們再來介紹一下廣義的瑞麗商,
? ? ? ? 廣義的瑞麗商是指這樣的函數 R(A,B,x) :
????????其中x為非零向量,而A,B為n×n的Hermitan矩陣。B為正定矩陣。它的最大值和最小值是什么呢?其實我們只要通過將其通過標準化就可以轉化為瑞利商的格式。我們令,則分母轉化為:
而分子轉化為:
此時我們的R(A,B,x)轉化為R(A,B,x′):
????????利用前面的瑞利商的性質,我們可以很快的知道,R(A,B,x′)的最大值為矩陣的最大特征值,或者說矩陣的最大特征值,而最小值為矩陣的最小特征值。
3. 二類LDA原理
? ? ? ? 我們先介紹一下稍微簡單,容易理解的二分類LDA入手,詳細了解一下LDA的原理
? ? ? ? 首先給定數據集 D={(x1,y1),(x2,y2),...,((xm,ym))} ,其中任意樣本xi為n維向量,yi∈{0,1}。另外我們定義Nj(j=0,1)為第j類樣本的個數,Xj(j=0,1)為第j類樣本的集合,而μj(j=0,1)為第j類樣本的均值向量,定義Σj(j=0,1)為第j類樣本的協方差矩陣(嚴格說是缺少分母部分的協方差矩陣)。
其中:
????????μj的表達式為:
????????Σj的表達式為:
我們將數據投影到一條直線上即可。我們假設我們的投影直線是向量w,則對任意一個樣本本xi,它在直線w的投影為,對于我們的兩個類別的中心點μ0,μ1在在直線ww的投影為和。
由于LDA需要讓不同類別的數據的類別中心之間的距離盡可能的大,也就是我們要最大化 ?,同時我們希望同一種類別數據的投影點盡可能的接近,也就是要同類樣本投影點的協方差?和??盡可能的小,即最小化?。綜上所述,我們的優化目標為:
在這里,大家是否有很多問好???
就是 w ,??在哪,怎么算,下面就是我們求解的過程,在本小節最后就是哦!!!
我們一般定義類內散度矩陣Sw為:
同時定義類間散度矩陣Sb為:
全局散度矩陣:
這樣我們的優化目標重寫為:
????????仔細一看上式,這不就是我們的廣義瑞利商嘛!這就簡單了,利用我們第二節講到的廣義瑞利商的性質,我們知道我們的J(w')最大值為矩陣的最大特征值,而對應w'為?的最大特征值對應的特征向量! 而的特征值和的特征值相同,的特征向量的特征向量w和的特征向量w′滿足的關系!?
在這里我們就求到了 w 了哦 !!!
? ? ? ? 注意到對于二類的時候,的方向恒平行于μ0?μ1,不妨令,將其帶入:,可以得到, 也就是說我們只要求出原始二類樣本的均值和方差就可以確定最佳的投影方向w了。
4.多類LDA原理
? ? ? ? 前面我們介紹了二分類的LDA,接下來我們再來看看多類別的LDA。
????????假設我們的數據集,,其中任意樣本?為n維向量,?。我們定義為j類樣本的個數,為j類樣本的集合,而?為第j類樣本的均值向量,定義?為第j類樣本的協方差矩陣。從在二類LDA里面定義的公式可以很容易的類推到多類LDA。
????????由于我們是多類向低維投影,則此時投影到的低維空間就不是一條直線,而是一個超平面了。假設我們投影到的低維空間的維度為d,對應的基向量為,基向量組成的矩陣為W,它是一個n*d的矩陣。
????????此時我們的優化目標應該可以變成為:
其中,,為所有樣本的均值向量。
但是在這里會有一個問題?
????????就是?和都是矩陣,不是標量,無法作為一個標量函數來優化!也就是說,我們無法直接用二類LDA的優化方法,怎么辦呢?
????????一般來說,我們可以用其他的一些替代優化目標來實現。
????????比如,常見的一個LDA多類優化目標函數定義為:
? ? ? ? 其中,??為 A的主對角線元素的乘積,W為n×d的矩陣。
????????
????????J(W)的優化過程可以轉化為:
此時,我再來觀察一下上式,會發現最右邊的式子,就是我們上面所講的廣義瑞麗商!!!最大值是矩陣的最大特征值,最大的d個值的乘積就是矩陣?的最大的d個特征值的乘積,此時對應的矩陣W為這最大的d個特征值對應的特征向量張成的矩陣。
由于W是一個利用了樣本的類別得到的投影矩陣,因此它的降維到的維度d最大值為k-1。為什么最大維度不是類別數k呢?
????????因為Sb中每個μj?μ的秩為1,因此協方差矩陣相加后最大的秩為k(矩陣的秩小于等于各個相加矩陣的秩的和),但是由于如果我們知道前k-1個μj后,最后一個μk可以由前k-1個μj線性表示,因此Sb的秩最大為k-1,即特征向量最多有k-1個。
5.LDA分類
那么在最佳的分類空間如何對樣本進行分類?
1)對二分類問題。由于只有兩個類別,在經過上面的求解后,最后所有樣本將會映射到一維空間中,設兩個不同樣本映射后的中心點分別為?,;我們將兩個類別的中心點之間中心點作為分類點。
最后,我們將
的x分為一類,其他的分為另一類。
2)對多分類問題。通過LDA方法最終將原始數據映射到c-1個維度上,現在我們需要在這c-1個維度上將樣本集分成c類。這個怎么分呢?本人暫時也不知道,能想到的只是將問題轉化為二分類問題。實際上,對于多類的情況主要考慮用來降維。
對于此類問題,我們主要將它轉化為二分類來處理,我們使用一對其余的方法。簡單來說就是先將所有c類樣本分成1和2~c,然后再將2~c分為2和3~c,以此類推,直到完全分開。
6.LDA算法流程
輸入:數據集?,其中任意樣本xixi為n維向量,,降維到的維度d。
輸出:降維后的樣本集D′
1) 計算類內散度矩陣Sw
2) 計算類間散度矩陣Sb?
3) 計算矩陣?
4)計算的最大的d個特征值和對應的d個特征向量(w1,w2,...wd)得到投影矩陣w
5)?對樣本集中的每一個樣本特征xi,轉化為新的樣本
6) 得到輸出樣本集?
二類LDA matlab舉例:
1.讀取數據集
data = xlsread('文件路徑')2.分離數據集
比如取數據集的前20行,2和3列
data1=data(1:20,2:3)比如把上面數據集的第一列定義為x,第二列定義為y;然后分類x0,x1
x = data1(:,1) y = data1(:,2) x0 = x(find(y==0)) x1 = x(find(y==1))諸如此類等等,請視情況自行決定,因我手頭沒有相關例題,只能介紹到這里了
3.求解w
%求均值 u0 = mean(x0); u1 = mean(x1);%求協方差 E0 = (x0-u0)'*(x0-u0); E1 = (x1-u1)'*(x1-u1);Sw = E0+E1; Sb = (u0-u1)*(u0-u1)'; w = (Sw)^(-1)*(u0-u1)4.輸出降維后的數據集
predict_y = w'* x5.分類
u = mean(w'* x) for i = xh = w' * i ;lei = 1*(h<u) end好了,這次更改就到這里結束了,后續會增加實例的!
總結
以上是生活随笔為你收集整理的LDA(线性判别分析)详解 —— matlab的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java幻灯片播放代码_简单常用的幻灯片
- 下一篇: 存储过程双层循环_别出心裁,为锂金属负极