下定决心开始写博客,希望能在写博客的过程中,总结思路,加深理解。在这里分享心得体会,共同进步。如有不足之处望批评指正。
本博客包含本人学习SVM和PCA的笔记,简要的说明其原理和方法步奏,人脸识别程序的解释说明,一并奉上完整的Matlab代码和相关的学习资料。
感觉自己在这上面花了不少时间但停留在一个较浅层次的了解上,希望后面学习SVM的朋友们能少走弯路。本人才疏学浅,博客难免有错漏,请见谅。如有转载请注明出处。
废话不多说,开始正文。
一. 支持向量机(SVM)
1.基本原理
给定训练样本集,在特征空间上找到一个分离超平面,将样本点分到不同的类。其中当且存在唯一的分类超平面,使得样本点距离分类超平面的距离最大。其中,距离超平面最近的点为该超平面的支持向量。
找到超平面后,对于待测点,通过计算该点相对于超平面的位置进行分类。其中,一个点距离分离超平面的距离越大,表示分类预测的确信程度越高。
SVM的数学推导非常繁琐,我个人了解得还不够透彻,推荐去看李航编写的《统计学习方法》,里面的数学理论推导非常详细。还有斯坦福大学的公开课《机器学习》,对这部分讲解得深入浅出,非常推荐。
2.惩罚参数C
惩罚参数表示对误分类点的惩罚权重。 如下图所示,惩罚参数的设置相当与在训练集的误差和间隔平面的距离上做一个折衷选择。当惩罚参数过大,如(a)易出现过拟合的情况,预测时,易导致误分情况。减小惩罚参数,开始容忍样本点落入间隔平面之内。过小会导致训练集的样本点对结果影响变小分类功能丧失。因此,选择合适的惩罚参数,会大大提高分类器的性能,非常关键。 实际运用过程中,采用交叉验证的方法选择合适的参数C。
在这里简要的提一下交叉验证(Cross Validation)的思想:即将所有的样本分成:训练集(train set),验证集(validation set)和测试集(test set),合适的划分比例如(3:3:4),使用不同的参数训练样本,在验证集上验证表现性能,得到一组最佳参数再应用在测试集上计算最终精度。此方法可大大减少因设置参数花费的时间。
3.核函数
实际的训练集通常是线性不可分的,这就需要运用到核技巧将原空间中的点映射到线性可分的高维空间。
常用的核函数有:线性核函数、多项式核函数、高斯核函数(RBF核函数),sigmoid核函数。
核函数的选择对分类器的影响较大,但是怎样选择我还是只能试,如果有核函数选择的经验,欢迎分享交流。
4.多分类支持向量机
实际分类通常涉及多类问题的区分,而SVM的理论是二类问题的区分,解决多类问题通常的方法如下,前两种方法最常见:
一对多(one-vs-rest)
构造k个SVM,分类时将未知样本分类为具有最大分类值的那类。
一对一(one-vs-one)
任意两个样本之间设计一个SVM共n(n-1)/2,分类时为得票最多的类。
层次分类(H-SVMs)
分层:所有类别分成子类,子类再分,循环得到单独的类。
5.libsvm工具箱
libsvm是台湾大学林智仁教授开发设计的一个简单、快速有效的SVM模式识别和回归的软件包,可在C、Java、Matlab、C#、Ruby、Python、R、Perl、Common LISP、Labview等数十种语言里实现。提供了很多默认参数,使用起来非常方便。下面附上的SVM人脸识别程序在matlab上运行时要提前安装好这个工具包,大大简化程序。
下载地址: https://www.csie.ntu.edu.tw/~cjlin/libsvm/
libsvm的安装教程:http://blog.csdn.net/loadstar_kun/article/details/7712308
注意:请确保先安装好VS,推荐安装VS2010 VS2012,并且Matlab的版本不能太低,如果先不匹配出现一些奇奇怪怪的原因导致安装不成功,我曾经在这上面耗费很多时间最后只好放弃那台电脑了。
二.主成分分析(PCA)
Principle Component Analysis,用于简化数据的复杂性,极大的保留原始数据的特征(差异大的特征),用于降维处理,便于后续进一步计算和操作。
包含如下步骤:
去除平均值(中心化样本)
CenteredMatrix = OriginalMatrix-repmat(mean(OriginalMatrix),numPic,1);
计算协方差矩阵
CovMatrix = CenteredMatrix’*CenteredMatrix;
计算协方差矩阵的特征值和特征向量
[V,D]=eigs(CovMatrix,kdimension);
(通常原始特征维数可能比较高,为避免协方差矩阵过于庞大的情况,协方差矩阵的特征向量通过计算CenteredMatrix*CenteredMatrix’的特征值和特征向量来间接获得)
将特征值从大到小排序,保留前N个特征向量(作为新的低维空间的基)
将数据转换到上述N个向量构成的新空间
pcaMatrix = CenteredMatrix*V;
三. 人脸识别程序
1. FaceRecognition.m主程序
将人脸图像生成用于训练和测试的矩阵,并分别生成相对的类别标签矩阵,使用libsvm工具箱操作。
svmtrain
model = svmtrain(train_label,train_data,option);
option的可选项:
-s svm类型:
SVM设置类型(默认0) 0 – C-SVC 1 –v-SVC 2 – 一类SVM 3 – e -SVR 4 – v-SVR
-t 核函数类型:核函数设置类型(默认2) 0 – 线性:u’v 1 – 多项式:(r*u’v + coef0)^degree 2 – RBF函数:ex