1 原理講的很清楚
人臉識别經典算法三:Fisherface(LDA):http://blog.csdn.net/smartempire/article/details/23377385
中心思想:将人臉圖像,從高維到低維投影Y=W*X; 使得投影後,人臉圖像類間最大,類内最小;
提出fisherface的文獻:Eigenfaces vs. Fisherfaces: Recognition Using Class Specific Linear Projection
Peter N. Belhumeur, Joao~ P. Hespanha, and David J. Kriegman (1997)
eigenface定義總體離散矩陣:
eigenface求解目标函數:![]()
人臉識别算法(二)---fisherface1 原理講的很清楚2 fisherface源碼 ![]()
人臉識别算法(二)---fisherface1 原理講的很清楚2 fisherface源碼 尋找矩陣W,使得Wt*St*W的行列式最大;因為St是滿秩的顯然,w為St的特征向量矩陣時,其行列式最大;
fisherface定義類間矩陣Sb、類内離散矩陣Sw:
fisherface定義目标函數:![]()
人臉識别算法(二)---fisherface1 原理講的很清楚2 fisherface源碼 ![]()
人臉識别算法(二)---fisherface1 原理講的很清楚2 fisherface源碼 這種為求得w的投影方法叫Fisher’s Linear Discriminant (FLD)
在二維下推導:
這樣就得到了J(w)的最終表示:
上式求極大值可以利用拉格朗日乘數法,不過需要限定一下分母的值,否則分子分母都變,怎麼确定最好的w呢。可以令![]()
人臉識别算法(二)---fisherface1 原理講的很清楚2 fisherface源碼 ,利用拉格朗日乘數法得到:![]()
人臉識别算法(二)---fisherface1 原理講的很清楚2 fisherface源碼 fisherface的目标函數化簡為:![]()
人臉識别算法(二)---fisherface1 原理講的很清楚2 fisherface源碼 ![]()
人臉識别算法(二)---fisherface1 原理講的很清楚2 fisherface源碼 fisherface下一步需要求Sw的逆矩陣 分析:
問題:現實中Sw一般是非滿秩的,是以Sw的逆矩陣不存在,Sw的秩最多是N-C的,因為Sw是d*N×N×d的,而一般N<d(樣本個數小于圖像分辨率),每一類中的列向量都是減去類平均值後的,是以每類的一個列向量可以用該類的其他列向量表示,故Sw秩不大于N-C;是以Ws的逆矩陣不存在;
解決:用PCA降維将特征空間的次元減少為N-C以下;
fisherface的目标函數進一步化簡為:
![]()
人臉識别算法(二)---fisherface1 原理講的很清楚2 fisherface源碼 顯然,W是Sw(-1)*Sb的特征向量矩陣;
總結:fisherface=PCA+FLD;
為了可以找到Sw的逆矩陣:
(1)先用PCA降維将特征空間的次元減少為N-C ;
(2)再用FLD(Fisher’s Linear Discriminant)降維将次元減少為C-1;
PCA和FLD投影的差別:
雜談:![]()
人臉識别算法(二)---fisherface1 原理講的很清楚2 fisherface源碼 ![]()
人臉識别算法(二)---fisherface1 原理講的很清楚2 fisherface源碼 顯然Sw是d*d維的矩陣,其實是一個協方差矩陣,然後将每個樣本相對于本類的均值的協方差矩陣,相加;其實和将每個樣本差排列為列向量最為矩陣的某一列得矩陣A;Sw=A*A';然後從作者表達的定義的樣子,好像協方差矩陣的行列式有某種含義,可以表示協方差的大小等;
還是不明白為什麼要用協方差矩陣的行列式表示矩陣的向量間的離散程度:???
:Sw是在原來向量空間中的協方差,Sw~表示的是将協方差矩陣映射到W的列向量表示的空間中;![]()
人臉識别算法(二)---fisherface1 原理講的很清楚2 fisherface源碼
2 fisherface源碼
MATLAB論壇(源碼):http://www.ilovematlab.cn/thread-179160-1-1.html
百度雲盤(源碼) http://pan.baidu.com/s/1i5JRMGt
2.1 代碼中的k近鄰:Class = knnclassify(Sample, Training, Group, k, distance);
K-最近鄰分類方法(KNN,k-nearest-neighbor classifier)是一種惰性學習法,所謂惰性就是KNN不像一些算法(比如SVM)一樣在接收待分類資料前就已經根據訓練資料構造好了分類模型,而是會在接受到訓練資料後,隻是對訓練資料進行簡單的存儲,并不構造分類模型,在接受到待分類資料時,KNN通過計算待分類資料X與所有訓練資料之間的距離,選擇前K個距離X最近的資料,并将這K個距離最近的資料中出現次數最多的類屬性賦給X。如下圖所示,判斷圖中待分類資料綠色圓點的分類情況:![]()
人臉識别算法(二)---fisherface1 原理講的很清楚2 fisherface源碼 當K取3時,此時離待分類資料綠色圓點最近的5個資料中,包含2個紅色三角和1個藍色四邊形,出現次數多的紅色三角的類屬性将會賦給此待分類資料。
當K取5時,此時離待分類資料綠色圓點最近的5個資料中,仍包含2個紅色三角,但是藍色四邊形數目增加到3個,3>2,是以,出現次數多的藍色四邊形的類屬性将會賦給此待分類資料。
參考:http://www.voidcn.com/article/p-dnooaunn-bbk.html
fisherface缺點:(1)小樣本問題(樣本數目小于樣本維數),
(2)多數實際問題屬于非線性可分,傳統的Fisher線性分析在這些問題上不能取得良好的結果
參考資料:
(1)提出fisherface的文獻:Eigenfaces vs. Fisherfaces: Recognition Using Class Specific Linear Projection
Peter N. Belhumeur, Joao~ P. Hespanha, and David J. Kriegman (1997)
(2)opencv有三種人臉識别的方法eigenface、fisherface、LBP且原理講的很好:
http://blog.csdn.net/loveliuzz/article/details/73499468
(3)人臉識别經典算法三:Fisherface(LDA):http://blog.csdn.net/smartempire/article/details/23377385
(4)MATLAB論壇(源碼):http://www.ilovematlab.cn/thread-179160-1-1.html
(5)百度雲盤(源碼) http://pan.baidu.com/s/1i5JRMGt
(6)最近鄰算法參考:http://www.voidcn.com/article/p-dnooaunn-bbk.html