幾種常見的模式識別算法

1. K-Nearest Neighbor
html

K-NN能夠說是一種最直接的用來分類未知數據的方法。基本經過下面這張圖跟文字說明就能夠明白K-NN是幹什麼的算法

 

knn

簡單來講,K-NN能夠當作:有那麼一堆你已經知道分類的數據,而後當一個新數據進入的時候,就開始跟訓練數據裏的每一個點求距離,而後挑離這個訓練數據最近的K個點看看這幾個點屬於什麼類型,而後用少數服從多數的原則,給新數據歸類。一個比較好的介紹k-NN的課件能夠見下面連接,圖文並茂,我當時一看就懂了數據庫

http://courses.cs.tamu.edu/rgutier/cs790_w02/l8.pdf編程

 

實際上K-NN自己的運算量是至關大的,由於數據的維數每每不止2維,並且訓練數據庫越大,所求的樣本間距離就越多。就拿咱們course project的人臉檢測來講,輸入向量的維數是1024維(32x32的圖,固然我以爲這種方法比較silly),訓練數據有上千個,因此每次求距離(這裏用的是歐式距離,就是咱們最經常使用的平方和開根號求距法) 這樣每一個點的歸類都要花上上百萬次的計算。因此如今比較經常使用的一種方法就是kd-tree。也就是把整個輸入空間劃分紅不少不少小子區域,而後根據臨近的原則把它們組織爲樹形結構。而後搜索最近K個點的時候就不用全盤比較而只要比較臨近幾個子區域的訓練數據就好了。kd-tree的一個比較好的課件能夠見下面連接:ide

http://www.inf.ed.ac.uk/teaching/courses/inf2b/learnnotes/inf2b-learn06-lec.pdfpost

固然,kd-tree有一個問題就是當輸入維數跟訓練數據數量很接近時就很難優化了。因此用PCA(稍後會介紹)降維大多數狀況下是頗有必要的測試

2. Bayes Classifier
優化

貝葉斯方法一篇比較科普的中文介紹能夠見pongba的平凡而神奇的貝葉斯方法: http://mindhacks.cn/2008/09/21/the-magical-bayesian-method/,實際實現一個貝葉斯分類器以後再回頭看這篇文章,感受就很不同。spa

在模式識別的實際應用中,貝葉斯方法絕非就是post正比於prior*likelihood這個公式這麼簡單,通常而言咱們都會用正態分佈擬合likelihood來實現。.net

用正態分佈擬合是什麼意思呢?貝葉斯方法式子的右邊有兩個量,一個是prior先驗機率,這個求起來很簡單,就是一大堆數據中求某一類數據佔的百分比就能夠了,好比300個一堆的數據中A類數據佔100個,那麼A的先驗機率就是1/3。第二個就是likelihood,likelihood能夠這麼理解:對於每一類的訓練數據,咱們都用一個multivariate正態分佈來擬合它們(即經過求得某一分類訓練數據的平均值和協方差矩陣來擬合出一個正態分佈),而後當進入一個新的測試數據以後,就分別求取這個數據點在每一個類別的正態分佈中的大小,而後用這個值乘以原先的prior即是所要求得的後驗機率post了。

貝葉斯公式中還有一個evidence,對於初學者來講,可能會一下無法理解爲何在實際運算中它不見了。實則上,evidence只是一個讓最後post歸一化的東西,而在模式分類中,咱們只須要比較不一樣類別間post的大小,歸一化反而增長了它的運算量。固然,在有的地方,這個evidence絕對不能省,好比後文提到的GMM中,須要用到EM迭代,這時候若是不用evidence將post歸一化,後果就會很可怕。

Bayes方法一個不錯的參考網頁可見下面連接:

http://www.cs.mcgill.ca/~mcleish/644/main.html


3. Principle Component Analysis

PCA,譯爲主元分析或者主成份分析,是一種很好的簡化數據的方法,也是PR中常見到不能再常見的算法之一。CSDN上有一篇很不錯的中文博客介紹PCA,《主元分析(PCA)理論分析及應用》,能夠見下面連接:

http://blog.csdn.net/ayw_hehe/archive/2010/07/16/5736659.aspx

對於我而言,主元分析最大的意義就是讓我明白了線性代數中特徵值跟特徵向量究竟表明什麼,從而讓我進一步感覺到了線性代數的博大精深魅力無窮。- -|||


PCA簡而言之就是根據輸入數據的分佈給輸入數據從新找到更能描述這組數據的正交的座標軸,好比下面一幅圖,對於那個橢圓狀的分佈,最方便表示這個分佈的座標軸確定是橢圓的長軸短軸而不是原來的x y。

那麼如何求出這個長軸和短軸呢?因而線性代數就來了:咱們求出這堆數據的協方差矩陣(關於什麼是協方差矩陣,詳見本節最後附的連接),而後再求出這個協方差矩陣的特徵值和特徵向量,對應最大特徵值的那個特徵向量的方向就是長軸(也就是主元)的方向,次大特徵值的就是第二主元的方向,以此類推。


關於PCA,推薦兩個不錯的tutorial:

(1) A tutorial on Principle Component Analysis從最基本的數學原理到應用都有,讓我在被老師的講課弄暈以後瞬間開悟的tutorial:

 http://www.cs.otago.ac.nz/cosc453/student_tutorials/principal_components.pdf

(2) 裏面有一個很生動的實現PCA的例子,還有告訴你PCA跟SVD是什麼關係的,對編程實現的幫助很大(固然大多數狀況下都不用本身編了):

 http://www.math.ucsd.edu/~gptesler/283/pca_07-handout.pdf

4. Linear Discriminant Analysis

LDA,基本和PCA是一對雙生子,它們之間的區別就是PCA是一種unsupervised的映射方法而LDA是一種supervised映射方法,這一點能夠從下圖中一個2D的例子簡單看出

lda

圖的左邊是PCA,它所做的只是將整組數據總體映射到最方便表示這組數據的座標軸上,映射時沒有利用任何數據內部的分類信息。所以,雖然作了PCA後,整組數據在表示上更加方便(下降了維數並將信息損失降到最低),但在分類上也許會變得更加困難;圖的右邊是LDA,能夠明顯看出,在增長了分類信息以後,兩組輸入映射到了另一個座標軸上,有了這樣一個映射,兩組數據之間的就變得更易區分了(在低維上就能夠區分,減小了很大的運算量)


在實際應用中,最經常使用的一種LDA方法叫做Fisher Linear Discriminant,其簡要原理就是求取一個線性變換,是的樣本數據中between classes scatter matrix(不一樣類數據間的協方差矩陣)和「within classes scatter matrix(同一類數據內部的各個數據間協方差矩陣)之比的達到最大。關於Fisher LDA更具體的內容能夠見下面課件,寫的很不錯~

http://www.csd.uwo.ca/~olga/Courses//CS434a_541a//Lecture8.pdf 

5. Non-negative Matrix Factorization

NMF,中文譯爲非負矩陣分解。一篇比較不錯的NMF中文介紹文能夠見下面一篇博文的連接,《非負矩陣分解:數學的奇妙力量》

http://chnfyn.blog.163.com/blog/static/26954632200751625243295/

 

這篇博文很大概地介紹了一下NMF的前因後果(固然裏面那幅圖是錯的。。。),固然若是你想更深刻地瞭解NMF的話,能夠參考Lee和Seung當年發表在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。論文中所提到的最簡單的方法,就是根據最小化||V-WH||的要求,經過Gradient Discent推導出一個update rule,而後再對其中的每一個元素進行迭代,最後獲得最小值,具體的update rule見下圖,注意其中Wia等帶下標的符號表示的是矩陣裏的元素,而非表明整個矩陣,當年在這個上面繞了很久。。

nmf

固然上面所提的方法只是其中一種而已,在http://spinner.cofc.edu/~langvillea/NISS-NMF.pdf中有更多詳細方法的介紹。

相比於PCA、LDA,NMF有個明顯的好處就是它的非負,由於爲在不少狀況下帶有負號的運算算起來都不這麼方便,可是它也有一個問題就是NMF分解出來的結果不像PCA和LDA同樣是恆定的。

6. Gaussian Mixture Model

GMM高斯混合模型粗看上去跟上文所提的貝葉斯分類器有點相似,但二者的方法有很大的不一樣。在貝葉斯分類器中,咱們已經事先知道了訓練數據(training set)的分類信息,所以只要根據對應的均值和協方差矩陣擬合一個高斯分佈便可。而在GMM中,咱們除了數據的信息,對數據的分類一無所知,所以,在運算時咱們不只須要估算每一個數據的分類,還要估算這些估算後數據分類的均值和協方差矩陣。。。也就是說若是有1000個訓練數據10租分類的話,須要求的未知數是1000+10+10(用未知數表示未必確切,確切的說是1000個1x10標誌向量,10個與訓練數據同維的平均向量,10個與訓練數據同維的方陣)。。。反正想一想都是很頭大的事情。。。那麼這個問題是怎麼解決的呢?

這裏用的是一種叫EM迭代的方法。

相關文章
相關標籤/搜索