pca 和lda区别
http://blog.csdn.net/scyscyao/article/details/5987581
這學期選了門模式識別的課。發(fā)現(xiàn)最常見的一種情況就是,書上寫的老師ppt上寫的都看不懂,然后繞了一大圈去自己查資料理解,回頭看看發(fā)現(xiàn),Ah-ha,原來本質(zhì)的原理那么簡單,自己一開始只不過被那些看似formidable的細節(jié)嚇到了。所以在這里把自己所學的一些點記錄下來,供備忘,也供參考。
?
?
1. K-Nearest Neighbor
K-NN可以說是一種最直接的用來分類未知數(shù)據(jù)的方法。基本通過下面這張圖跟文字說明就可以明白K-NN是干什么的
?
簡單來說,K-NN可以看成:有那么一堆你已經(jīng)知道分類的數(shù)據(jù),然后當一個新數(shù)據(jù)進入的時候,就開始跟訓(xùn)練數(shù)據(jù)里的每個點求距離,然后挑離這個訓(xùn)練數(shù)據(jù)最近的K個點看看這幾個點屬于什么類型,然后用少數(shù)服從多數(shù)的原則,給新數(shù)據(jù)歸類。一個比較好的介紹k-NN的課件可以見下面鏈接,圖文并茂,我當時一看就懂了
http://courses.cs.tamu.edu/rgutier/cs790_w02/l8.pdf
?
實際上K-NN本身的運算量是相當大的,因為數(shù)據(jù)的維數(shù)往往不止2維,而且訓(xùn)練數(shù)據(jù)庫越大,所求的樣本間距離就越多。就拿我們course project的人臉檢測來說,輸入向量的維數(shù)是1024維(32x32的圖,當然我覺得這種方法比較silly),訓(xùn)練數(shù)據(jù)有上千個,所以每次求距離(這里用的是歐式距離,就是我們最常用的平方和開根號求距法) 這樣每個點的歸類都要花上上百萬次的計算。所以現(xiàn)在比較常用的一種方法就是kd-tree。也就是把整個輸入空間劃分成很多很多小子區(qū)域,然后根據(jù)臨近的原則把它們組織為樹形結(jié)構(gòu)。然后搜索最近K個點的時候就不用全盤比較而只要比較臨近幾個子區(qū)域的訓(xùn)練數(shù)據(jù)就行了。kd-tree的一個比較好的課件可以見下面鏈接:
http://www.inf.ed.ac.uk/teaching/courses/inf2b/learnnotes/inf2b-learn06-lec.pdf
當然,kd-tree有一個問題就是當輸入維數(shù)跟訓(xùn)練數(shù)據(jù)數(shù)量很接近時就很難優(yōu)化了。所以用PCA(稍后會介紹)降維大多數(shù)情況下是很有必要的?
2. Bayes Classifier 貝葉斯方法一篇比較科普的中文介紹可以見pongba的平凡而神奇的貝葉斯方法:?http://mindhacks.cn/2008/09/21/the-magical-bayesian-method/,實際實現(xiàn)一個貝葉斯分類器之后再回頭看這篇文章,感覺就很不一樣。 在模式識別的實際應(yīng)用中,貝葉斯方法絕非就是post正比于prior*likelihood這個公式這么簡單,一般而言我們都會用正態(tài)分布擬合likelihood來實現(xiàn)。 用正態(tài)分布擬合是什么意思呢?貝葉斯方法式子的右邊有兩個量,一個是prior先驗概率,這個求起來很簡單,就是一大堆數(shù)據(jù)中求某一類數(shù)據(jù)占的百分比就可以了,比如300個一堆的數(shù)據(jù)中A類數(shù)據(jù)占100個,那么A的先驗概率就是1/3。第二個就是likelihood,likelihood可以這么理解:對于每一類的訓(xùn)練數(shù)據(jù),我們都用一個multivariate正態(tài)分布來擬合它們(即通過求得某一分類訓(xùn)練數(shù)據(jù)的平均值和協(xié)方差矩陣來擬合出一個正態(tài)分布),然后當進入一個新的測試數(shù)據(jù)之后,就分別求取這個數(shù)據(jù)點在每個類別的正態(tài)分布中的大小,然后用這個值乘以原先的prior便是所要求得的后驗概率post了。 貝葉斯公式中還有一個evidence,對于初學者來說,可能會一下沒法理解為什么在實際運算中它不見了。實則上,evidence只是一個讓最后post歸一化的東西,而在模式分類中,我們只需要比較不同類別間post的大小,歸一化反而增加了它的運算量。當然,在有的地方,這個evidence絕對不能省,比如后文提到的GMM中,需要用到EM迭代,這時候如果不用evidence將post歸一化,后果就會很可怕。 Bayes方法一個不錯的參考網(wǎng)頁可見下面鏈接: http://www.cs.mcgill.ca/~mcleish/644/main.html3. Principle Component Analysis PCA,譯為主元分析或者主成份分析,是一種很好的簡化數(shù)據(jù)的方法,也是PR中常見到不能再常見的算法之一。CSDN上有一篇很不錯的中文博客介紹PCA,《主元分析(PCA)理論分析及應(yīng)用》,可以見下面鏈接: http://blog.csdn.net/ayw_hehe/archive/2010/07/16/5736659.aspx 對于我而言,主元分析最大的意義就是讓我明白了線性代數(shù)中特征值跟特征向量究竟代表什么,從而讓我進一步感受到了線性代數(shù)的博大精深魅力無窮。- -|||
PCA簡而言之就是根據(jù)輸入數(shù)據(jù)的分布給輸入數(shù)據(jù)重新找到更能描述這組數(shù)據(jù)的正交的坐標軸,比如下面一幅圖,對于那個橢圓狀的分布,最方便表示這個分布的坐標軸肯定是橢圓的長軸短軸而不是原來的x y。 那么如何求出這個長軸和短軸呢?于是線性代數(shù)就來了:我們求出這堆數(shù)據(jù)的協(xié)方差矩陣(關(guān)于什么是協(xié)方差矩陣,詳見本節(jié)最后附的鏈接),然后再求出這個協(xié)方差矩陣的特征值和特征向量,對應(yīng)最大特征值的那個特征向量的方向就是長軸(也就是主元)的方向,次大特征值的就是第二主元的方向,以此類推。
關(guān)于PCA,推薦兩個不錯的tutorial: (1) A tutorial on Principle Component Analysis從最基本的數(shù)學原理到應(yīng)用都有,讓我在被老師的講課弄暈之后瞬間開悟的tutorial: ?http://www.cs.otago.ac.nz/cosc453/student_tutorials/principal_components.pdf (2) 里面有一個很生動的實現(xiàn)PCA的例子,還有告訴你PCA跟SVD是什么關(guān)系的,對編程實現(xiàn)的幫助很大(當然大多數(shù)情況下都不用自己編了):
?http://www.math.ucsd.edu/~gptesler/283/pca_07-handout.pdf
?
4. Linear Discriminant Analysis
LDA,基本和PCA是一對雙生子,它們之間的區(qū)別就是PCA是一種unsupervised的映射方法而LDA是一種supervised映射方法,這一點可以從下圖中一個2D的例子簡單看出
圖的左邊是PCA,它所作的只是將整組數(shù)據(jù)整體映射到最方便表示這組數(shù)據(jù)的坐標軸上,映射時沒有利用任何數(shù)據(jù)內(nèi)部的分類信息。因此,雖然做了PCA后,整組數(shù)據(jù)在表示上更加方便(降低了維數(shù)并將信息損失降到最低),但在分類上也許會變得更加困難;圖的右邊是LDA,可以明顯看出,在增加了分類信息之后,兩組輸入映射到了另外一個坐標軸上,有了這樣一個映射,兩組數(shù)據(jù)之間的就變得更易區(qū)分了(在低維上就可以區(qū)分,減少了很大的運算量)。
PCA 是無監(jiān)督的,它所作的只是將整組數(shù)據(jù)整體映射到最方便表示這組數(shù)據(jù)的坐標軸上,映射時沒有利用任何數(shù)據(jù)內(nèi)部的分類信息
用主要的特征代替其他相關(guān)的非主要的特征,所有特征之間的相關(guān)度越高越好
但是分類任務(wù)的特征可能是相互獨立的
LDA是有監(jiān)督的,使得類別內(nèi)的點距離越近越好(集中),類別間的點越遠越好。
在實際應(yīng)用中,最常用的一種LDA方法叫作Fisher?Linear?Discriminant,其簡要原理就是求取一個線性變換,是的樣本數(shù)據(jù)中“between?classes?scatter?matrix”(不同類數(shù)據(jù)間的協(xié)方差矩陣)和“within?classes?scatter?matrix”(同一類數(shù)據(jù)內(nèi)部的各個數(shù)據(jù)間協(xié)方差矩陣)之比的達到最大。關(guān)于Fisher LDA更具體的內(nèi)容可以見下面課件,寫的很不錯~
http://www.csd.uwo.ca/~olga/Courses//CS434a_541a//Lecture8.pdf?
?
?
5. Non-negative Matrix Factorization
NMF,中文譯為非負矩陣分解。一篇比較不錯的NMF中文介紹文可以見下面一篇博文的鏈接,《非負矩陣分解:數(shù)學的奇妙力量》
http://chnfyn.blog.163.com/blog/static/26954632200751625243295/
?
這篇博文很大概地介紹了一下NMF的來龍去脈(當然里面那幅圖是錯的。。。),當然如果你想更深入地了解NMF的話,可以參考Lee和Seung當年發(fā)表在Nature上面的NMF原文,"Learning the parts of objects by non-negative matrix factorization"
http://www.seas.upenn.edu/~ddlee/Papers/nmf.pdf
讀了這篇論文,基本其他任何介紹NMF基本方法的材料都是浮云了。
?
NMF,簡而言之,就是給定一個非負矩陣V,我們尋找另外兩個非負矩陣W和H來分解它,使得后W和H的乘積是V。論文中所提到的最簡單的方法,就是根據(jù)最小化||V-WH||的要求,通過Gradient Discent推導(dǎo)出一個update rule,然后再對其中的每個元素進行迭代,最后得到最小值,具體的update rule見下圖,注意其中Wia等帶下標的符號表示的是矩陣里的元素,而非代表整個矩陣,當年在這個上面繞了好久。。
當然上面所提的方法只是其中一種而已,在http://spinner.cofc.edu/~langvillea/NISS-NMF.pdf中有更多詳細方法的介紹。
相比于PCA、LDA,NMF有個明顯的好處就是它的非負,因為為在很多情況下帶有負號的運算算起來都不這么方便,但是它也有一個問題就是NMF分解出來的結(jié)果不像PCA和LDA一樣是恒定的。
?
6.?Gaussian?Mixture?Model
GMM高斯混合模型粗看上去跟上文所提的貝葉斯分類器有點類似,但兩者的方法有很大的不同。在貝葉斯分類器中,我們已經(jīng)事先知道了訓(xùn)練數(shù)據(jù)(training?set)的分類信息,因此只要根據(jù)對應(yīng)的均值和協(xié)方差矩陣擬合一個高斯分布即可。而在GMM中,我們除了數(shù)據(jù)的信息,對數(shù)據(jù)的分類一無所知,因此,在運算時我們不僅需要估算每個數(shù)據(jù)的分類,還要估算這些估算后數(shù)據(jù)分類的均值和協(xié)方差矩陣。。。也就是說如果有1000個訓(xùn)練數(shù)據(jù)10租分類的話,需要求的未知數(shù)是1000+10+10(用未知數(shù)表示未必確切,確切的說是1000個1x10標志向量,10個與訓(xùn)練數(shù)據(jù)同維的平均向量,10個與訓(xùn)練數(shù)據(jù)同維的方陣)。。。反正想想都是很頭大的事情。。。那么這個問題是怎么解決的呢?
這里用的是一種叫EM迭代的方法。
具體使用方法可以參考http://neural.cs.nthu.edu.tw/jang/books/dcpr/doc/08gmm.pdf?這份臺灣清華大學的課件,寫的真是相當?shù)馁?#xff0c;實現(xiàn)代碼的話可以參考:
1. 倩倩的博客http://www.cnblogs.com/jill_new/archive/2010/12/01/1893851.html?和
2.?http://www.cs.ru.nl/~ali/EM.m
?
當然 Matlab里一般也會自帶GMM工具箱,其用法可以參考下面鏈接:
http://www.mathworks.com/help/toolbox/stats/gmdistribution.fit.html
http://www.cnblogs.com/LeftNotEasy/archive/2011/01/08/lda-and-pca-machine-learning.html
LDA:
??? LDA的全稱是Linear Discriminant Analysis(線性判別分析),是一種supervised learning。有些資料上也稱為是Fisher’s Linear Discriminant,因為它被Ronald Fisher發(fā)明自1936年,Discriminant這次詞我個人的理解是,一個模型,不需要去通過概率的方法來訓(xùn)練、預(yù)測數(shù)據(jù),比如說各種貝葉斯方法,就需要獲取數(shù)據(jù)的先驗、后驗概率等等。LDA是在目前機器學習、數(shù)據(jù)挖掘領(lǐng)域經(jīng)典且熱門的一個算法,據(jù)我所知,百度的商務(wù)搜索部里面就用了不少這方面的算法。
??? LDA的原理是,將帶上標簽的數(shù)據(jù)(點),通過投影的方法,投影到維度更低的空間中,使得投影后的點,會形成按類別區(qū)分,一簇一簇的情況,相同類別的點,將會在投影后的空間中更接近。要說明白LDA,首先得弄明白線性分類器(Linear Classifier):因為LDA是一種線性分類器。對于K-分類的一個分類問題,會有K個線性函數(shù):
???? 當滿足條件:對于所有的j,都有Yk > Yj,的時候,我們就說x屬于類別k。對于每一個分類,都有一個公式去算一個分值,在所有的公式得到的分值中,找一個最大的,就是所屬的分類了。
??? 上式實際上就是一種投影,是將一個高維的點投影到一條高維的直線上,LDA最求的目標是,給出一個標注了類別的數(shù)據(jù)集,投影到了一條直線之后,能夠使得點盡量的按類別區(qū)分開,當k=2即二分類問題的時候,如下圖所示:
???? 紅色的方形的點為0類的原始點、藍色的方形點為1類的原始點,經(jīng)過原點的那條線就是投影的直線,從圖上可以清楚的看到,紅色的點和藍色的點被原點明顯的分開了,這個數(shù)據(jù)只是隨便畫的,如果在高維的情況下,看起來會更好一點。下面我來推導(dǎo)一下二分類LDA問題的公式:
???? 假設(shè)用來區(qū)分二分類的直線(投影函數(shù))為:
??? LDA分類的一個目標是使得不同類別之間的距離越遠越好,同一類別之中的距離越近越好,所以我們需要定義幾個關(guān)鍵的值。
??? 類別i的原始中心點為:(Di表示屬于類別i的點)
??? 類別i投影后的中心點為:
??? 衡量類別i投影后,類別點之間的分散程度(方差)為:
??? 最終我們可以得到一個下面的公式,表示LDA投影到w后的損失函數(shù):
?? 我們分類的目標是,使得類別內(nèi)的點距離越近越好(集中),類別間的點越遠越好。分母表示每一個類別內(nèi)的方差之和,方差越大表示一個類別內(nèi)的點越分散,分子為兩個類別各自的中心點的距離的平方,我們最大化J(w)就可以求出最優(yōu)的w了。想要求出最優(yōu)的w,可以使用拉格朗日乘子法,但是現(xiàn)在我們得到的J(w)里面,w是不能被單獨提出來的,我們就得想辦法將w單獨提出來。
?? 我們定義一個投影前的各類別分散程度的矩陣,這個矩陣看起來有一點麻煩,其實意思是,如果某一個分類的輸入點集Di里面的點距離這個分類的中心店mi越近,則Si里面元素的值就越小,如果分類的點都緊緊地圍繞著mi,則Si里面的元素值越更接近0.
?? 帶入Si,將J(w)分母化為:
?? 同樣的將J(w)分子化為:
?? 這樣損失函數(shù)可以化成下面的形式:
?
?? 這樣就可以用最喜歡的拉格朗日乘子法了,但是還有一個問題,如果分子、分母是都可以取任意值的,那就會使得有無窮解,我們將分母限制為長度為1(這是用拉格朗日乘子法一個很重要的技巧,在下面將說的PCA里面也會用到,如果忘記了,請復(fù)習一下高數(shù)),并作為拉格朗日乘子法的限制條件,帶入得到:
?? 這樣的式子就是一個求特征值的問題了。
?? 對于N(N>2)分類的問題,我就直接寫出下面的結(jié)論了:
?? 這同樣是一個求特征值的問題,我們求出的第i大的特征向量,就是對應(yīng)的Wi了。
?? 這里想多談?wù)勌卣髦?#xff0c;特征值在純數(shù)學、量子力學、固體力學、計算機等等領(lǐng)域都有廣泛的應(yīng)用,特征值表示的是矩陣的性質(zhì),當我們?nèi)〉骄仃嚨那癗個最大的特征值的時候,我們可以說提取到的矩陣主要的成分(這個和之后的PCA相關(guān),但是不是完全一樣的概念)。在機器學習領(lǐng)域,不少的地方都要用到特征值的計算,比如說圖像識別、pagerank、LDA、還有之后將會提到的PCA等等。
?? 下圖是圖像識別中廣泛用到的特征臉(eigen face),提取出特征臉有兩個目的,首先是為了壓縮數(shù)據(jù),對于一張圖片,只需要保存其最重要的部分就是了,然后是為了使得程序更容易處理,在提取主要特征的時候,很多的噪聲都被過濾掉了。跟下面將談到的PCA的作用非常相關(guān)。
??? 特征值的求法有很多,求一個D * D的矩陣的時間復(fù)雜度是O(D^3), 也有一些求Top M的方法,比如說power method,它的時間復(fù)雜度是O(D^2 * M), 總體來說,求特征值是一個很費時間的操作,如果是單機環(huán)境下,是很局限的。
PCA:
??? 主成分分析(PCA)與LDA有著非常近似的意思,LDA的輸入數(shù)據(jù)是帶標簽的,而PCA的輸入數(shù)據(jù)是不帶標簽的,所以PCA是一種unsupervised learning。LDA通常來說是作為一個獨立的算法存在,給定了訓(xùn)練數(shù)據(jù)后,將會得到一系列的判別函數(shù)(discriminate function),之后對于新的輸入,就可以進行預(yù)測了。而PCA更像是一個預(yù)處理的方法,它可以將原本的數(shù)據(jù)降低維度,而使得降低了維度的數(shù)據(jù)之間的方差最大(也可以說投影誤差最小,具體在之后的推導(dǎo)里面會談到)。
??? 方差這個東西是個很有趣的,有些時候我們會考慮減少方差(比如說訓(xùn)練模型的時候,我們會考慮到方差-偏差的均衡),有的時候我們會盡量的增大方差。方差就像是一種信仰(強哥的話),不一定會有很嚴密的證明,從實踐來說,通過盡量增大投影方差的PCA算法,確實可以提高我們的算法質(zhì)量。
??? 說了這么多,推推公式可以幫助我們理解。我下面將用兩種思路來推導(dǎo)出一個同樣的表達式。首先是最大化投影后的方差,其次是最小化投影后的損失(投影產(chǎn)生的損失最小)。
??? 最大化方差法:
??? 假設(shè)我們還是將一個空間中的點投影到一個向量中去。首先,給出原空間的中心點:
??? 假設(shè)u1為投影向量,投影之后的方差為:
??? 上面這個式子如果看懂了之前推導(dǎo)LDA的過程,應(yīng)該比較容易理解,如果線性代數(shù)里面的內(nèi)容忘記了,可以再溫習一下,優(yōu)化上式等號右邊的內(nèi)容,還是用拉格朗日乘子法:
??? 將上式求導(dǎo),使之為0,得到:
??? 這是一個標準的特征值表達式了,λ對應(yīng)的特征值,u對應(yīng)的特征向量。上式的左邊取得最大值的條件就是λ1最大,也就是取得最大的特征值的時候。假設(shè)我們是要將一個D維的數(shù)據(jù)空間投影到M維的數(shù)據(jù)空間中(M < D), 那我們?nèi)∏癕個特征向量構(gòu)成的投影矩陣就是能夠使得方差最大的矩陣了。
??? 最小化損失法:
??? 假設(shè)輸入數(shù)據(jù)x是在D維空間中的點,那么,我們可以用D個正交的D維向量去完全的表示這個空間(這個空間中所有的向量都可以用這D個向量的線性組合得到)。在D維空間中,有無窮多種可能找這D個正交的D維向量,哪個組合是最合適的呢?
??? 假設(shè)我們已經(jīng)找到了這D個向量,可以得到:
??? 我們可以用近似法來表示投影后的點:
??? 上式表示,得到的新的x是由前M 個基的線性組合加上后D - M個基的線性組合,注意這里的z是對于每個x都不同的,而b對于每個x是相同的,這樣我們就可以用M個數(shù)來表示空間中的一個點,也就是使得數(shù)據(jù)降維了。但是這樣降維后的數(shù)據(jù),必然會產(chǎn)生一些扭曲,我們用J描述這種扭曲,我們的目標是,使得J最小:
??? 上式的意思很直觀,就是對于每一個點,將降維后的點與原始的點之間的距離的平方和加起來,求平均值,我們就要使得這個平均值最小。我們令:
??? 將上面得到的z與b帶入降維的表達式:
??? 將上式帶入J的表達式得到:
???? 再用上拉普拉斯乘子法(此處略),可以得到,取得我們想要的投影基的表達式為:
??? 這里又是一個特征值的表達式,我們想要的前M個向量其實就是這里最大的M個特征值所對應(yīng)的特征向量。證明這個還可以看看,我們J可以化為:
??? 也就是當誤差J是由最小的D - M個特征值組成的時候,J取得最小值。跟上面的意思相同。
??? 下圖是PCA的投影的一個表示,黑色的點是原始的點,帶箭頭的虛線是投影的向量,Pc1表示特征值最大的特征向量,pc2表示特征值次大的特征向量,兩者是彼此正交的,因為這原本是一個2維的空間,所以最多有兩個投影的向量,如果空間維度更高,則投影的向量會更多。
?
總結(jié):
??? 本次主要講了兩種方法,PCA與LDA,兩者的思想和計算方法非常類似,但是一個是作為獨立的算法存在,另一個更多的用于數(shù)據(jù)的預(yù)處理的工作。另外對于PCA和LDA還有核方法,本次的篇幅比較大了,先不說了,以后有時間再談:
總結(jié)
以上是生活随笔為你收集整理的pca 和lda区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。