几种常见的模式识别算法

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迭代的方法。

相关文章
相关标签/搜索