1. 程式人生 > >LDA演算法原理及matlab實現

LDA演算法原理及matlab實現

注:本文非筆者原創,原文轉載自:http://blog.csdn.net/porly/article/details/8020696

1. LDA是什麼

線性判別式分析(Linear Discriminant Analysis),簡稱為LDA。也稱為Fisher線性判別(Fisher Linear Discriminant,FLD),是模式識別的經典演算法,在1996年由Belhumeur引入模式識別和人工智慧領域。

基本思想是將高維的模式樣本投影到最佳鑑別向量空間,以達到抽取分類資訊和壓縮特徵空間維數的效果,投影后保證模式樣本在新的子空間有最大的類間距離最小的類內距離,即模式在該空間中有最佳的可分離性。

LDA與前面介紹過的PCA都是常用的降維技術。PCA主要是從特徵的協方差角度,去找到比較好的投影方式LDA更多的是考慮了標註即希望投影后不同類別之間資料點的距離更大,同一類別的資料點更緊湊

下面給出一個例子,說明LDA的目標。

 

       可以看到兩個類別,一個綠色類別,一個紅色類別。左圖是兩個類別的原始資料,現在要求將資料從二維降維到一維。直接投影到x1軸或者x2軸,不同類別之間會有重複,導致分類效果下降。右圖對映到的直線就是用LDA方法計算得到的,可以看到,紅色類別和綠色類別在對映之後之間的距離是最大的,而且每個類別內部點的離散程度是最小的(或者說聚集程度是最大的)。

這裡還有一個LDA的例子:

下圖是一個LDA和PCA區別的例子:

       兩個類別,class1的點都是圓圈,class2的點都是十字。圖中有兩條直線,斜率在1左右的這條直線是PCA選擇的對映直線,斜率在 -1左右的這條直線是LDA選擇的對映直線。其餘不在這兩條直線上的點是原始資料點。可以看到由於LDA考慮了“類別”這個資訊(即標註),對映後,可以很好的將class1和class2的點區分開。也就是說,LDA是以分類為導向的,考慮的是如何選擇投影方向使得分類更好,是有監督的;而PCA是一種無監督的降維方式,它只是單純的降維,它考慮的是如何選擇投影面才能使得降維以後的樣本資訊保留的最大(而這是通過方差大來體現的)。

2. LDA的一些說明

   第一,降維後的維度是多少?

     PCA降維是直接和資料維度相關的,比如原始資料是n維的,那麼PCA後,可以任意選取1維、2維,一直到n維都行(當然是對應特徵值大的那些)。LDA 降維是直接和類別的個數相關的,與資料本身的維度沒關係,比如原始資料是n維的,一共有C個類別,那麼LDA降維之後,一般就是1維,2維到C-1維進行選擇(當然對應的特徵值也是最大的一些),舉個例子,假設圖象分類,兩個類別正例反例,每個圖象10000維特徵,那麼LDA之後,就只有1維特徵,並且這維特徵的分類能力最好。
PS:對於很多兩類分類的情況,LDA之後就剩下1維,找到分類效果最好的一個閾值貌似就可以了。

   第二,投影的座標系是否正交

    PCA投影的座標系都是正交的,而LDA根據類別的標註,關注分類能力,因此不保證投影到的座標系是正交的(一般都不正交)。

3. LDA計算過程(兩個類別)

這一節,主要討論只有兩個類別的資料,LDA的計算。現在要找到一個向量w,將資料x投影到w上去之後,得到新的資料y。第一,為了實現投影后的兩個類別的距離較遠,用對映後兩個類別的均值差的絕對值來度量。第二,為了實現投影后,每個類內部資料點比較聚集,用投影后每個類別的方差來度量。

類別i的均值:


   


    類別i投影后的均值(實際上等於mi的投影):


    


    投影后均值差的絕對值:


    


    投影后的方差(這裡的y是類別i中資料投影后的資料,即y=w_t * x):


    


    目標優化函式為:


    


    下面通過展開m'和s',定義S_B和S_W:

優化目標J(w)改寫如下,這樣是為了方便推匯出計算w的方法。


    


    推導過程忽略了,最後推導結果如下:


    

假設資料是n維特徵,m個數據,分類個數為2。那麼Sw實際上是每個類別的協方差矩陣之和,每個類別的協方差矩陣都是n*n的,因此Sw是n*n的,m1-m2是n*1的。計算得到的w是n*1的,即w將維特徵對映為1維。

PS:這裡不用糾結與Sw的協方差矩陣形式,實際上這是拆拆開來w和w_t後的結果,實際上w*Sw*w_t後,仍舊是一個數值,即表示兩個類的投影后方差之和。

4. LDA計算過程(多個類別)

     對於S_w,就是“兩個類別的協方差矩陣之和”變成了“多個類別的協方差矩陣之和”。


     

      對於S_b,以前是“兩個類別的均值之差的絕對值”,現在多個類別了,怎麼計算呢?計算任意兩個類別之間的均值之差的絕對值之和?這樣對於N個類別,需要 C(N,2)次計算,這可能是一個方法,不過LDA使用的方法,計算每個類別的均值與所有類別均值的差異,並且對每個類別的資料量進行加權處理。下式中,m為所有類別的均值,m_i為類別i的均值,n_i為類別i的資料量。


    

        對於n維特徵、C個類別、m個樣本的資料,是將n維資料對映為C-1維。即所求的w是一個n*(c-1)的矩陣。S_w是一個n*n的矩陣(沒有除以樣本數的協方差矩陣之和),S_B是一個C*C的矩陣,實際上S_B矩陣的的秩最多是C-1,這是因為n_i*(m_i-m)這c向量實際上是線性相關的,因為他們的和是均值m的常數倍。這導致後面求解w,實際上是求出C-1個向量一個構成的一個w。

具體計算忽略。

下面就是一個三個類別的例子: 

4. LDA其他變種

如果原始資料投影后,仍舊不能很好的分開,那麼Kernel LDA是一個解決方法。

LDA在計算量上與資料的維度有關,2DLDA能夠大大減小LDA計算量。

5. LDA的一些問題

第一,LDA最多投影出C-1維特徵,如果需要更多特徵,則要引入其他方法。

第二,LDA假設資料服從單峰高斯分佈,比如下面的複雜資料結構。

5. 參考

轉載自:http://blog.csdn.net/jnulzl/article/details/49894041http://blog.csdn.net/jnulzl/article/details/49894041

一、前言

最近由於研究需要,要用到線性判別分析(LDA)。於是找了很多資料來看,結果發現大部分講的都是理論知識,因此最後還是看的一知半解,後來終於找到了個英文的文件,作者由PCA引入LDA,看過後豁然開朗,主要是文件中有詳細的例子,為了保持原版在此就直接貼上過來了——後面的例子是結合MATLAB實現的!

二、LDA理論詳解

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

三、LDA例項詳解

下面是作者文件中配的一個具體例子,其中的程式碼是MATLAB程式碼。

17
18
19
20
21
22
23
24
25
26
27

四、相關的中文LDA資料

除了上面英文版的LDA外,我感覺以下關於LDA的中文文章講的也是挺不錯的:

LDA詳細推導: