模式识别和机器学习、数据挖掘的区别与联系(转发)
和晨枫老大在这个帖子里关于工程科研和工业实践的脱节从控制侃到了模式识别和机器学习,老大让俺写写。真让俺惶惶然啊!俺这土鳖来在了(liao3)西西河,那就是学习来了,潜水看老大们的帖子为主,偶尔发言也不敢谈专业,怕贻笑大方。不过老大既然说了,那我就来试着说说我所理解的这方面的概念关系,可能也能说到方法和思路。权当是俺这几年的对这些领域的认识心得,和学习总结吧。
说到机器学习和数据挖掘,不能不提到自动控制和模式识别乃至人工智能。刚开始接触这些名字的时候,真是云山雾罩。反俺正考大学是听着自动化这名字很拉风就学了自动化;等考研的时候发现自动化里面居然有个啥“模式识别与智能系统”的,又觉得很拉风,就学了模式识别;等学了模式识别,又出来了机器学习和数据挖掘……一个比一个拉风。对这些领域,俺都是先进门,再了解;先结婚,再恋爱。我尽量把自己理解的这些领域的样子说说吧。
概念的严格定义我就不去考据了,毕竟不是写背景综述。但是想说清概念之间的包含关系,还是得说说大致的分化过程,不然就会不明白为啥模式识别会放在自动化这个领域里。
(一)模式识别的诞生与人工智能 31
追到源头,首先班门弄斧一段自控,老大轻拍-.-!
自动控制起始是从工业革命之后,人们就希望设计出减少人工干预,能自己进行调节(regulate)的机器,工程领域开始想出了根轨迹等等土招儿。等到40年代,伴随二战的需要,计算机的产生,维纳(Wiener)——信息论和控制论(Cybernetics)的祖师爷正式开创了这“两论”。
控制论这个词是维纳根据古希腊词根发明出来的。用老爷子自己的话说就是“Cybernetics :or control and communication in the animal and the machine”。animal先不提,那是人家天才小时候就对生物学有兴趣;在工程方面,控制论的control主要是围着machine转的。因为祖师开山的时候是二战中,初衷就是要让机器代替人进行防空武器的随动瞄准。
维纳是数学家,写出来的理论和公式,让当时的工程师们看着实在头疼。但是维纳不仅仅是数学家和“搞理论”的,实际工程问题,人家二战中参与了,也想到了。最典型的就是对噪声的处理。
典型的负反馈控制系统框图里,从“传感器”的到“给定输入”之间,画一根线就连过来了。可是实际中,传感器有误差,测量回路中有包含噪声,需要的测量值甚至根本就是淹没在一片嘈杂的信号里面(水声信号)。这时候管识别“真实值”的问题叫滤波,通过设计各种滤波器来解决。
但是一学到现代信号处理这块就会发现和传统的信号处理不一样了,不再是时域、频域、Z域的滤波器变来变去了。从维纳最佳滤波的算法和ARMA模型的原理就可以看出来,既然是用随机过程和概率统计来看待和描述信号和噪声,那么已经可以把这个滤波问题用“估计(Estimation)”、“预测(Prediction)”来描述了。此外,对系统的状态方程确定参数的问题,好像是用的“辨识(Identification)”吧,都差不多。之所以罗嗦这些词,是因为这些词在模式识别的分支里出现的词。
祖师爷提出、总结这些方法大概主要为了玩转控制问题里的那些传感器。但是,其他不需要machine、不需要控制的领域,但是也需要用传感器去测量、去噪声、估计、预测、辨识啊!其实从需求角度,类似“怎么让机器能像人一样分辨人的语音”的研究,也是从40年代就开始了,一开始也是“语谱图”之类的土招儿,好像是贝尔实验室弄的吧。类似的问题“识别航拍照片”,“识别手写文字”都是类似的工作。这些工作也都希望使用计算机代替人来做呢。
花开两朵各表一枝,先放下各行各业的需求和土招儿暂且不说,再来看看计算机。与此同时,计算机产生之后也需要找到更多的应用领域。除了吸引人的计算速度之外,数学家开始琢磨让计算机再干点别的。
于是,50年代开始出现“人工智能(artificial intelligence AI)”这个词。注意是artificial不是simulation。也就是说,不是用计算机“模仿”人脑硬件结构和人的思维过程,而是研究怎么让半导体造计算机用二进制数据结构+算法去达到肉长的人脑的智能“效果”。好比做题,只需要你能得到结果,不看步骤。数据结构和算法是计算机专业的核心之一,也是当年在“制造计算机”之外,研究怎么“使用计算机”的独门课程。(咱们中国大学里的计算机系大概是60年代从电子系、自动化系里独立出来的。)所以 “会编程、搞软件的”IT民工里,科班生比半路出家的“蓝领”强就强在,除了会if for这些语法之外,就是人家数据结构、算法、离散数学这些方面正经学过。那些“走迷宫”、“8皇后问题”,就是数学家抽象出来,丢给计算机去做的人的智力题。
AI又叫狭义的人工智能,基本可以等同于计算机算法了。当然也确实有研究人脑结构和思维过程,用计算机去simulation人脑的“广义”人工智能,不过那更多是医学、生理学的事情啦。也许有人说不对啊,神经网络(Neural Networks NN)可是就是模拟人的神经元呀的算法啊,算狭义还是广义?这个,统计学家们发来抗议电,说NN压根就没那么玄乎,不过就是类似“投影寻踪回归(Projection Pursuit Regression)”的算法。这个后面写到模式识别具体算法时候会提到。
但是除了做智力题之外,人的能力里属于智能的到底都有什么呢?经过总结,其中之一是识别能力,然后是决策能力。
这下好了,一边是需求,一边是计算机的计算能力。估计、预测、辨识、识别……是时候把这些类似的工作统筹解决了!
这样在60年代,模式识别(Pattern Recognition PR)产生了
(二)模式识别的流程与机器学习 28
一个标准的模式识别流程是:
“客观对象”—1—>“数值表示”—2—>“计算机算法”—3—>“识别结果”
但是这个流程只是计算机工作时的流程。而在能这样工作之前还要干很多事。比如人脸识别,一个计算机算法又不是天生就认识很多人,算法要经过训练和学习好了,才能照上面这个过程工作。
那么到底在训练、学习些什么,又是在识别些呢?
这个还是要回到定义。“模式识别”这个词不是太容易顾名思义的,我直到研究生入学以后很长时间还是不明白是什么意思,就知道是能分类。
还是说人脸识别吧。对人来说,看见来自于1个人的人脸图像,即使是不同表情和姿势的,我们也能认出这些图像来自于同一个人。而你之所以能认出来,可能是观察了脸型+发型,也可能是五官形状的组合。可是到底是图像上的什么决定了你的判断呢?你有的能说出来,可是有的却又说不清道不明的。于是,就用一个抽象的词——“模式”来形容那些能够让你判断出哪些样本属于同一类别、能够和其他类别相区别的特征或者属性。
我们下面设计计算机算法为每1个人的图像建立唯一的1个“模式”或者说模型,不同的N个人对应于N个模型。很可能每个人的身份编号i对应一个参数模型Mi。这个建立或者说训练(train)过程可能就是“统计”这些图像,确定每个模型的参数。
而开发者为了评价算法性能,也要先预备一些已知类别的图像,分成train set 和test set,这样在训练集上训练好的算法,要测试集上测试一下。根据测试结果调整算法参数,或者实在太差的话要换一种算法了。不断的调整参数、不断改程序,不断的train,不断的test……所以这方面的论文通常要附上算法在各种数据集,各种情况下的结果。一个图,一张表的背后,要写好多程序,花好多时间在电脑上运行。
这样训练好后,就可以按上面那个流程工作了。如果一张属于第i人的图片来了,算法用保存的N个人的模型去分别计算相似度,判断这张图片来自于模型Mj的可能性最大,也就等于电脑可以通过看图片识别出了这人的身份是j。如果j等于真实身份i,那就识别正确了,如果每次都识别对,那电脑就达到了人脑的能力了。
注意算法在输出j的时候是不知道真实身份i的,那么这种工作,就可以看成是一种预测(Prediction)。如果需要输出是离散变量,比如这里是类别,就称为分类(Classification),而需要预测连续型变量的,比如股指,房价,就称为回归(Regression)。这里的回归没有针对“过去”的值的意思,就是说预测的目标输出的是连续性的值。
好了,现在来说机器学习(Machine Learning ML)。回顾一下你的模型从哪里来的?虽然有些模型假设,但主要从输入的已知身份的数据中来的。而算法的“训练-考试”过程,又很像人的学习过程,于是把这一类计算机算法叫做Machine Learning。其实是Machine Learning from data了。看起来是Machine在不断自己 Learning,其实是人写的算法让它一直learning。如果算法是纯用统计学,也可以叫统计学习(Statistical Learning)。
所以在我看来,ML可能是最类似AI的范畴了,都是计算机算法嘛。区别是AI是具备类人能力就行,不管算法怎么来的,一个拍脑袋定义的出来的公式也算。而ML要窄一些,是特指经过Learning from data 过程而获得的“智能”。用统计学的里的概念来说,ML是一种数据驱动的,非参数(Nonparametric)或者半参数(Semiparametric)算法。
再来比较PR和ML。可以说,PR里面的算法部分基本上一定是属于ML。区别在于,PR里的ML算法主要就是在做预测。而整个ML就要广多了,如果你的算法输入是棋谱,那么训练好的算法就可以下棋打牌。但是UCI上面供机器学习算法之间进行能力比较的标准数据集基本都是分类和回归问题。这么看ML和PR实在是太相似了。
说到了这里,PR里面的ML算法,主要都是在用统计学(少部分有图论),问题也就出来了。提出算法的主要是人家数学家、统计学家、或者计算机专业的干的,已经属于science了。可是怎么模式识别的事净是自动化、电子信息、通信这些专业的搞呢?虽然你们攒一起改叫Electronics Engineering了,可那也是Engineering啊,本科顶多学点高数,线代,复变,信号系统,古典概型和简单数理统计,再学编码啥的,到硕士嘛顶多学点矩阵论,随机过程顶天了。就这点数学底子,提不出啥牛X算法,凭啥模式识别专业还是你们这些工科生霸着啊?丢给数学系、统计系,或者计算机系得了,人家CS好歹也是S啊。
嗯,我也疑惑了很久,明明都是在折腾数学,怎么还是赖在工科里呢?
(三)模式识别中的工程、技术 27
为什么要说说PR没被数学、统计和计算机专业抢去的问题,实际是想分析一下PR里的科学与技术,理论与工程的问题。
如果去学PR,看任何一种这方面的经典教材来看,基本上全是在讲各种理论、各种分类回归算法、和算法的思路。(关于这方面的经典教材,其实特别想单独来说的。如果是第一本,挑一本对自己胃口的书很重要。原因是经典基本都是700页起的,而且基本满眼望去都是公式。理科生不论,对于看理论经常感觉力不从心,或者没什么耐心的工科生,如果找了一本不对自己胃口的书可能就很难看下去,Amazon上的书评里每本经典都有一堆5星,但是也颇有些1 2星的。)
虽然可以说“学PR 就等于学各种分类算法”,但是不等于说PR 就等于分类算法。最起码炮制这方面的论文就不等于炮制分类算法,想想也是,不然工科生还有的混吗!
作为说PR的最后一节,这次工科生要来吹吹牛,看看PR除了统计理论和算法,有什么离不了工程、技术的地方。
还是先把流程图再画一遍:
“客观对象”—1—>“数值表示”—2—>“计算机算法”—3—>“识别结果”
上一篇主要说的是 “计算机算法”—3—>“识别结果”这块,确实最重要,是核心。“数值表示”—2—>“计算机算法”比较简单:算法要求输入的数据通常都是个很规整的矩阵,比如N个训练样本,每个样本p个特征(feature),输入就是一个N*p的矩阵。 此外,有的算法需要对列进行标准化,有的不接受连续型变量和离散值变量的混合,有的干脆不接受连续型变量,要量化变成哑变量。所以根据算法的不同,对数据的形式也要稍微做点加工。这也没啥特别的。
关键就在于前面,“客观对象”—1—>“数值表示”。
还是继续以人脸识别为例吧。研究了一个算法,都要在网上的几个标准人脸库中的图像上实验自己的算法。通常库里每个人的照片包括各种姿态(比如稍微左右侧一些,抬头低头),表情变化,各种光照阴影,有的还有饰物比如眼睛,帽子,发型变化。图像尺寸都是统一的,的比如256*256,灰度也是8bit这样。
好了,你的算法在几个人脸库上跑得不错,实验数据有了,论文有谱了,你很开心。老板也很开心,于是老板接了个小项目,让你参与做个人脸识别的门禁系统。这时候你就会发现,想按照那个完整流程来工作,1这一步的问题一点也不少。
首先就是传感器的问题。传感器直接决定了图像有没有形变,颜色和灰度有没有改变,是不是清楚,分辨率有多高。通常的问题不是“有还是没有”,而是“有。怎么办?”
所以从硬件选型到板卡布置这块首先少不了“专门经验”,然后还有成像这块和图像处理的知识。得到内外参数,怎么把畸变调整一下,然后降降噪声,直方图均衡调整一下对比度,尺寸也调整一下。这些图像处理课里的内容,虽然也都是简单的数学公式,但是,场合不同,想要的图像效果不同,参数上也总要微调的——让我想起了PID参数的整定。嗯,很工科。
插一句,我所理解的工程学就是对实际问题的专门经验的积累。公式理论简单,而经验的获得,只需要多花时间和实际问题打交道,自然熟能生巧。这么看工科很easy,经验也没什么神秘的。但是每个人的时间总是有限的,如果专门在一个领域花了比别人多的时间,那么他的经验就变得宝贵起来了。此外“接触实际”四个字也不是人人都喜欢的。实际中没有书本上的“理想条件”,只有各种层出不穷的想不到的问题。挑战性一点不比在理论上探索低。工科的思维就是事前对可能遇到的实际问题的复杂性的敏感和估计,事中遇到问题时的能想法子解决。可以对性能妥协、将就;可以对参数近似、也可以试验出来;可以把原本充满创新的玩意改得朴实无华或者面目全非——一切只为了这玩意最后能工作起来、能动换(然后再慢慢往好看、好用上改)。
嗯,跑题了,继续。现在图像清楚得已经堪比人脸库了,识别效果还不错。找客户来验收吧!可是给客户演示完,人家突然问系统能不能集成到一起,做到DSP和嵌入式系统上;还要这样,还要那样……嗯?等等,你忽然想到好像程序是在双核PC上跑的,好像用了好些个MATLAB导出的函数,有个算法还是R里面的……
你嘴上说是,脸上没反应,但心里浮现的却是《潜伏》里陆桥山审马奎时从牙缝里挤出来的台词:我真想撕烂你的嘴!你当初不是说……
可老板下了死命令,大家只好大干快上干起来!作为开发算法的你,责无旁贷啊!
软件彻底用C和C++重写!不能用好使的MATLAB了,API真矬,简单的矩阵运算要费劳资这么大劲。不知不觉1礼拜过去了,终于写好了。
赶紧到下载到那边已经是改到第N版刚拿回来,还热乎乎的板卡:
咦,没反应?软件还是硬件问题?那边查电路,这边改程序试试?
呼,有影了,可是噪声咋这么严重,鼻子不是鼻子脸不是脸的?摄像头还是板子上有干扰?软件上能再改改参数?
终于运行起来了,怎么好像卡死了?哦,原来是太慢了。硬件条件比PC机差了好几个档次了,怎么办啊,换个简单一点的算法?那性能咋办?那之前那个算法好不容易得到实验结果不是都白做了么?
……
满头黑线了吧?
这个人脸识别的例子有点夸张了,但不是完全虚构出来的。通过这个例子想说的是,数据来源,软硬件的布置,性能的取舍,参数的实验调整都是论文上看不到也写不出来的实际工程问题。通常需要各种不同的传感器和硬件打交道,也需要各行各业的专业背景知识。涉及图像的少不了摄像头、照相机和图像处理的知识;做水声信号和语音识别,少不了拾音器阵列,频域方面的信号处理知识。这也就是为啥自动化,电子,通信、甚至生物医学专业能掺和其中的原因。
最后总结一下我对PR的认识:
PR是因为各个领域有“电脑代替人脑”的实际需求才产生的,所以是一定面向应用的。
PR不是在标准数据集上验证分类算法的性能就完了,这个是ML的事情。PR是要把ML算法在实际问题中用起来。是理论加实际,科学和技术(虽然理论是核心)。
前三节主要是围绕PR来说,就说到这吧。下面打算试着说说我认识的机器学习算法概貌和一直没露面的数据挖掘。
(四)可解释性和数据挖掘 40
从这节开始,打算把ML算法的概貌描绘一下。
ML领域发展特别快,几乎所有的论文都声称自己弄出一种新算法。看论文多了之后我的体会是,如果心里没有几条线索,就分辨不出这一堆算法的区别与联系,最后的结果是学会一堆“支离”的算法,学习了苹果只知道这是苹果,给个鸭梨就不认识了,给个苹果梨就更不明白是什么东西了。至于应用时,更不知道哪种算法更适合自己的问题。
一般都是把ML算法分成两大类:有监督学习(Supervised Learning)和无监督学习(Unsupervised Learning)。我觉得这其实是从输入数据的形式上分的,说这个离不了公式和图表了,不想先说这个。
从ML的目的和用途来分,可以分成预测(Prediction)和数据挖掘(Data Mining)。我觉得对应用来说,这么分更有意义些。
这两大类算法的核心区别就是:预测问题更重视算法的预测能力(Predictive Power),数据挖掘问题更重视算法的可解释性(Interpretability)。
预测之前说过了,针对的目标变量如果是离散的类别标记,比如医学上的某种病的阴性阳性,或者人的身份编号,就叫分类(Classification);如果针对的连续的变量,比如股价,房价,就叫回归(Regression)。
预测能力很容易理解,我们只关心train set上训练好的算法在test set上面误差、误分类率要尽可能低。也就是说,模型给出的预测要尽可能地接近实际结果。
可解释性就要好好说说了。简单说就是,我们更关心输入的p维变量之间的联系,或者算法产生的预测是哪几个变量起了主要作用,也就是说,算法给出预测结果的根据是什么。
比如商业智能(BI)上常见的购物篮分析(Market Basket Analysis)就是个典型的看中可解释性的数据挖掘问题。因为直接有“钱景”,所以几乎每个讲统计的,讲数据挖掘、机器学习的,甚至讲数据库应用的书,都要提到这个事,现在各个购物购书网站也都在做这个事。
零售商从积攒的海量顾客账单中可以“挖掘”出什么呢?首先,分析哪几种商品容易同时出现在顾客的购物篮里,商场就可以把这些看起来风马牛不相及的东西放在一起,方便顾客购买;另一方面,分析客户办会员卡时留下的个人信息,可以分析出经常光顾本商场的是那些特征的人,这样对外投放使广告便更加有的放矢,可望吸引更多这些类型的人来。
流行的做法是每张账单作为1个p维向量,对应所有p种商品。买了置1,没买置0。N张账单就组成了一张N*p的值为0-1的表格。用流行的Apriori算法从数据中“挖掘”购物模式。比如一个support = 0.03,confidence = 0.87的Rule:
{花生酱,黄油,果酱}=>{面包}
这就说明,如果一个顾客同时买了前三种东西,那么他同时买面包的可能性是87%。而这种同时买4种东西的顾客,在总顾客中占3%。
这个模式看起来平淡无奇,可是有时有很奇怪的模式被挖掘出来,忘了从哪里看到的一个例子:
{尿布,奶粉}=>{啤酒,刮胡刀}
把这4个放一起确实提高了销量,原因后面再说。
而对客户身份信息的挖掘结果比如说是:
support = 0.13,confidence = 0.8
{在家讲英语,有住房,职业是professional}=>收入大于$40000。
那就赶紧针对这些人,在他们经常出没的地方做广告吧!
注意看这些“模式”,前面的括号里只有2 3个“变量”,远远小于总共p个变量。也就是说,我们做出的预测,只依赖于所有p个变量中特定几个变量。
如果我说这就是可解释性。恐怕大家还是不明白。嗯,佛教上阐释概念,有“表诠”和“遮诠”的说法。为了说明一个概念,表诠就是说“它是什么”;遮诠却不说“它是什么”,而是说“它不是什么,不是什么……”。嗯,下面再和不具备可解释性的算法比一下就知道了。
比如还是N*p的矩阵,如果我想分析什么东西导致了买面包,我把其他p-1种东西 +1个截距项一共N*p做为X,面包N*1作为Y,做个最小二乘:
Beta = (X’*X)-1*X’*y
这个结果Beta意味着什么呢?有了这个Beta,给我任何一个1*(p-1)的账单x,都能给出买面包与否的预测值y_est = x* Beta。
但是,看着这个回归出来的p维的Beta,我不能像之前那样,简单说出对买面包来说是哪几种别的商品起了更重要的作用,也就没法想出提高销量的方法了。
这就是预测能力和可解释性的区别。
预测能力就是输出结果的准确度,而可解释性是可以用来帮助人们理解模式背后的原因。比如从前面那个{尿布,奶粉}=>{啤酒,刮胡刀}的购物模式,再配合顾客的年龄和性别,就最后推断出,可能是妻子在坐月子时,年轻父亲们被打发出来购物的。进而可以重新设计实验或者进行改进:不但把这已发现的4种商品摆一起,而且把其他年轻父亲可能会买的东西也摆过来试试。
医学上也是这样。不是特别关注用已有的p项的因素(行为习惯、实验条件、检查化验结果)去准确预测疾病,而更关注如何从p个因素中发现是哪几种因素组合更容易导致疾病,进而可以改进实验设计,改进检查,乃至改进预防和治疗的方案。传统上统计学里作为因素分析(Factor Analysis)问题来研究,而数据挖掘使用的方法就更多,涉及的更广。而且数据挖掘也不仅仅是用来进行变量选择和重要性分析,可以用树、图、层次聚类之类直观的结构,描述变量之间的复杂依赖关系。
前一段有个书叫《小趋势》(microtrends)的,里面举了美国社会统计学家统计出来的许多看起来奇妙的小众人群,用来描述当今的美国社会。甚至进而有针对性地设计竞选宣传策略,左右选举结果。这都属于看中可解释性的数据挖掘了。
总结一下预测和数据挖掘的区别:
预测是偏重得到决策结果,数据挖掘是偏重分析决策原因和过程。
预测问题主要是在生物特征鉴别(人脸,语音,指纹,虹膜)、机器视觉、目标跟踪这些领域,直接代替人进行决策。在商业数据,医学数据里,需要解决数据挖掘问题,给人提供参考。
之所以要费劲区分预测和数据挖掘,因为天下没有免费的午餐,一种算法预测精度高了通常很难具备太好的可解释性。要针对具体的应用问题选择合适的算法,就要明白自己更需要的哪种能力。很多算法同时具备一定的预测准确度和可解释性,仅从算法形式上很难分清,还是应该从应用背景上来分析。
个人最后发点谬论:一个应用问题到底是预测还是数据挖掘,说到底是你有没有能力改变数据来源,或者重新设计输入数据?针对图像的,你一定是在既定的传感器硬件条件下设计算法的;散户炒股,你的数据源也是有限的,所以这些都是预测问题,而且预测准了就够了。而商业销售数据、医学实验数据,你是可以改变销售策略,改变实验条件的,而且,你的目的不仅是分析现有数据,更在于是后面应该采取什么行动。
站在工科来侃理科,熟悉预测却偏要来侃数据挖掘,一头汗啊。