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求解目标函数:
寻找矩阵W,使得Wt*St*W的行列式最大;因为St是满秩的显然,w为St的特征向量矩阵时,其行列式最大;
fisherface定义类间矩阵Sb、类内离散矩阵Sw:
fisherface定义目标函数:
这种为求得w的投影方法叫Fisher’s Linear Discriminant (FLD)
在二维下推导:
这样就得到了J(w)的最终表示:
上式求极大值可以利用拉格朗日乘数法,不过需要限定一下分母的值,否则分子分母都变,怎么确定最好的w呢。可以令,利用拉格朗日乘数法得到:
fisherface的目标函数化简为:
fisherface下一步需要求Sw的逆矩阵 分析:
问题:现实中Sw一般是非满秩的,所以Sw的逆矩阵不存在,Sw的秩最多是N-C的,因为Sw是d*N×N×d的,而一般N<d(样本个数小于图像分辨率),每一类中的列向量都是减去类平均值后的,所以每类的一个列向量可以用该类的其他列向量表示,故Sw秩不大于N-C;所以Ws的逆矩阵不存在;
解决:用PCA降维将特征空间的维度减少为N-C以下;
fisherface的目标函数进一步化简为:
显然,W是Sw(-1)*Sb的特征向量矩阵;
总结:fisherface=PCA+FLD;
为了可以找到Sw的逆矩阵:
(1)先用PCA降维将特征空间的维度减少为N-C ;
(2)再用FLD(Fisher’s Linear Discriminant)降维将维度减少为C-1;
PCA和FLD投影的区别:
杂谈:
显然Sw是d*d维的矩阵,其实是一个协方差矩阵,然后将每个样本相对于本类的均值的协方差矩阵,相加;其实和将每个样本差排列为列向量最为矩阵的某一列得矩阵A;Sw=A*A';然后从作者表达的定义的样子,好像协方差矩阵的行列式有某种含义,可以表示协方差的大小等;
还是不明白为什么要用协方差矩阵的行列式表示矩阵的向量间的离散程度:???
:Sw是在原来向量空间中的协方差,Sw~表示的是将协方差矩阵映射到W的列向量表示的空间中;
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。如下图所示,判断图中待分类数据绿色圆点的分类情况:
当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