姓名:刘成龙 学号:16020199016
转载自:https://www.jiqizhixin.com/articles/2018-08-20-5,有删节。
【嵌牛导读】:机器学习 聚类、回归、分类算法
【嵌牛鼻子】:机器学习 聚类、回归、分类算法
【嵌牛提问】:你学会了机器学习的聚类、回归、分类算法吗?
【嵌牛正文】:
机器学习,一言以蔽之就是人类定义一定的计算机算法,让计算机根据输入的样本和一些人类的干预来总结和归纳其特征和特点,并用这些特征和特点和一定的学习目标形成映射关系,进而自动化地做出相应反应的过程。
这个反应可能是做出相应的标记或判断,也可能是输出一段内容——图片、程序代码、文本、声音,而机器自己学到的内容我们可以描述为一个函数、一段程序、一组策略等相对复杂的关系描述。
算法这种东西在最初出现的时候是一种确定性的机器指令执行序列,也就是说,机器需要怎么做早就在程序一开始就设定好。虽然说在程序执行的过程中可以依靠有限的参数对程序执行过程所涉及的对象,执行次数,执行分支条件等进行设定,但是基本行为逻辑已经大抵确定。
在这个过程中,机器——计算机是非常被动的,它老老实实地严格执行程序员赋予它们的指令执行序列,没有任何“学习”的行为。这也没办法,因为最开始的图灵机模型在设计的时候就是期望计算机以这种方式。
机器学习从学习的种类来说,最常见的我们习惯分作两种:
一种叫“无监督学习”(Unsupervised Learning)
一种叫“有监督学习”(Supervised Learning)
所谓“无监督学习”,是指人们在获得训练的向量数据后在没有标签的情况下尝试找出其内部蕴含关系的一种挖掘工作,这个过程中使用者除了可能要设置一些必要的“超参数”(Hyper-parameter)以外不用对这些样本做任何的标记甚至是过程干预;“有监督学习”与此不同,每一个样本都有着明确的标签,最后我们只是要总结出这些训练样本向量与标签的映射关系。
所以在这两种方式下,处理的逻辑有很大的区别,对于初学的朋友需要格外注意。
一、 聚类
聚类——英文为Clustering,它就是我们说的典型的“无监督学习”的一种,就是把物理对象或抽象对象的集合分组为由彼此类似的对象组成的多个类的分析过程。
聚类这种行为我们不要觉得很神秘,也不要觉得这个东西是机器学习所独有的,恰恰相反,聚类的行为本源还是人自身。我们学习的所有的数据挖掘或者机器学习的算法或者思想的来源都是人类自己的思考方式,只不过我们把它教给机器让它们代劳,让他们成为我们肢体和能力的延伸而不是让他们替我们做创造和思考。
聚类是一种什么现象呢?我们人类在认识客观世界的过程中其实一直遇到容量性的问题,我们遇到的每一棵树、每一朵花、每一只昆虫、每一头动物、每一个人、每一栋建筑……每个个体之间其实都不同,有的差距还相当大。那么我们人在认知和记忆这些客观事物的过程中就会异常痛苦,因为量实在是大到无法承受的地步。
因此人类才会在“自底向上”的认识世界的过程中“偷懒”性地选择了归纳归类的方式,注意“偷懒”的这种方式是人类与生俱来的方法。
我们在小时候被父母用看图说话的方式来教咿呀学语的时候就有过类似的体会了,图片上画了一只猴子,于是我们就认识了,这是一只猴子;图片上画了一辆汽车,于是我们就了解了,这是一辆汽车……
等我们上街或者去动物园的时候再看,猴子也不是画上的猴子,而且众多猴子之间也长得各式各样,每个都不同,我们会把它们当成一个一个的新事物去认识吗?我们看汽车也同样,大小,颜色,样式,甚至是喇叭的声音也是形形色色五花八门,它们在我们眼里是一个个新的事物吗?不,它们都还是汽车。
这些事物之间确实有所不同,但是它们对我们的认知带来了很大的困扰吗?并没有。我们无论如何是不会把猴子和汽车当成一类事物去认知的,猴子彼此之间是不同,但是体格、毛发、行为举止,种种形态让我们认为这些不同种类的猴子都还是猴子一个大类的动物,别说是和汽车混为一谈,就是跟狗、马匹、熊这些脊椎动物我们也能轻易地分开。
人类天生具备这种归纳和总结的能力,能够把认知的事物相似地放到一起来作为一类事物做认识,它们之间可以有彼此的不同,但是有一个我们心里的“限度”,只要在这个限度内,特征稍有区别无关大碍,它们仍然还是这一类事物。
在这一类事物的内部,同样有这种现象,一部分个体之间比较相近,而另一部分个体之间比较相近,这两部分个体彼此之间我们人还是能够明显认知到差别,那么这个部分的事物又会在大类别的内部重新划分成两个不同的部分进行认知。比如汽车直观从样子上可以分成小轿车、卡车、面包车等种类,虫子们也被人轻易地从外型上区别为飞虫、爬虫、毛毛虫……
在没有人特意教给我们不同小种群的称谓与特性之前,我们自然具备的这种由我们主观的认知能力,以特征形态的相同或近似将它们划在一个概念下,特征形态的不同划在不同的概念下,这本身就是聚类的思维方式。
比较常用的聚类算法有K-Means、DBSCAN等几种,基本思路都是利用每个向量之间的“距离”——这里指的是空间中的欧氏距离或者曼哈顿距离。从远近来进行彼此是否更适于从属与同一类别来做的分类判断。
假如有三个1维样本,一个180,一个179,一个150,这三个向量如果要分成两类的话,应该是180和179这两个分在一个类别,150单一个类别。原因就是180和179两个的距离为1,而180和179距离150分别为30和29个单位——非常远,就是从肉眼感官上来看也是这样。用机器来做学习的话,它也能够通过算法自动去感知到这些向量之间的距离,然后将它们彼此之间那些靠得近的分在一起以区别于其他类簇。
在用机器做聚类学习的时候,我们每种算法都对应有相应的计算原则,可以把输入的各种看上去彼此“相近”的向量分在一个群组中。然后下一步,人们通常更有针对性地去研究每一组聚在一起的对象所拥有的共性以及那些远离各个群组的孤立点——这种孤立点研究在刑侦、特殊疾病排查等方面都有应用。
在这个过程中,从获得到具体的样本向量,到得出聚类结果,人们是不用进行干预的,这就是“非监督”一词的由来。
二、回归
回归是一种解题方法,或者说“学习”方法,也是机器学习中一块比较重要的概念。
回归的英文是Regression,单词原型的regress大概的意思是“回退,退化,倒退。”其实Regression——回归分析的意思是借用里面“倒退,倒推”的含义。简单说就是“由果索因”的过程,是一种归纳的思想——当我看到大量的事实所呈现的样态,我推断出原因或客观蕴含的关系是如何的;当我看到大量的观测而来的向量(数字)是某种样态,我设计一种假说来描述出它们之间蕴含的关系是如何的。
在机器学习领域,最常用的回归是两大类——一类是线性回归,一类是非线性回归。
所谓线性回归,就是在观察和归纳样本的过程中认为向量和最终的函数值呈现线性的关系。而后设计这种关系为:
y = f(x) = wx + b
这里的w和x分别是1×n和n×1的矩阵,wb则指的是这两个矩阵的内积。具象一点说,例如,如果你在一个实验中观察到一名病患的几个指标呈现线性关系(注意这个是大前提,如果你观察到的不是线性关系而用线性模型来建模的话,是会得到欠拟合的结果的)。
拿到的x是一个5维的向量,分别代表一名患者的年龄、身高、体重、血压、血脂这几个指标值,y标签是描述他们血糖程度的指标值,x和y都是观测到的值。在拿到大量样本(就是大量的x和y)后,我猜测向量 (年龄,身高,体重,血压,血脂) 和与其有关联关系的血糖程度y值有这样的关系:
y=w1×年龄+w2×身高+w3×体重+w4×血压+w5×血脂+b
那么就把每一名患者的 (年龄,身高,体重,血压,血脂) 具体向量值带入,并把其血糖程度y值也带入。这样一来,在所有的患者数据输入后,会出现一系列的六元一次方程,未知数是w1~w5和b——也就是w矩阵的内容和偏置b的内容。而下面要做的事情就是要把w矩阵的内容和偏置b的内容求出一个最“合适”的解来。这个“合适”的概念就是要得到一个全局范围内由f(x)映射得到的y和我真实观测到的那个y的差距的加和,写出来是这种方式:
怎么理解这个Loss的含义呢?右面的
表示加和,相当于做一个一个循环,i是循环变量,从1做到n,覆盖训练集当中的每一个样本向量。加和的内容是wxi+b和yi的差值,每一个训练向量xi在通过我们刚刚假设的关系f(x)=wx+b映射后与实际观测值yi的差距值。取绝对值的含义就是指这个差距不论是比观测值大或者观测值小,都是一样的差距。将全局范围内这n个差距值都加起来我们管他叫总差距值好了,就是这个 的含义。
那么显而易见,这个映射关系中如果w和b给的理想的话,应该这个差距值是0,因为每个x经过映射都“严丝合缝”地和观测值一致了——这种状况太理想了,在实际应用中是见不到的。不过,Loss越小就说明这个映射关系描述越精确,这个还是很直观的。那么想办法把Loss描述成:Loss=f(w, b)
再使用相应的方法找出保证Loss尽可能小的w和b的取值,就算是大功告成了。我们后面会讲计算机怎么来求这一类的解——放心,有办法的,即便不用联立解方程。一旦得到一个误差足够小的w和b并能够在验证用的数据集上有满足当前需求的精度表现后就可以了。例如,预测病患的血糖误差为误差平均小于等于0.3为容忍上线,训练后在验证集上的表现为误差平均为0.2,那就算是合格了。
请注意,在传统的机器学习中回归、分类这些算法里都有一个要把获取到的数据集分成训练集合验证集的过程。用训练集数据来做训练,归纳关系用;用验证集数据来做验证,避免过拟合现象,如果你不太明白过拟合是什么意思也没关系后面我们会讲的,不必着急。数据集的划分三七开也可以,二八开也没什么不行,现在生产环境中大致用的都是这样一种比例,反正训练集一侧用数据多的那部分。
由于这种假设中输入的x向量与标签值y是一种线性关系y=f(x)=wx+b,所以才叫做线性回归。最常见的形式是y=f(x)=ax+b这种形式,也就是x是一个一维向量,w也是一个一维向量的情况。如果是呈现其他关系比如指数关系,对数关系,那么这种时候你用线性回归去做拟合会发现它的损失函数非常大,在验证集上表现出来的误差也非常大,这是一种欠拟合现象,我们后面同样会讲,大家先技术这样一个名词。
非线性回归之中在机器学习领域应用最多的当属逻辑回归。它和线性回归都叫回归,但是逻辑回归看上去更像分类。我们先在回归这一节提一下这种回归的工作方式。与前面我们说的线性回归不同,在这种模型中观察者假设的前提是y只有两种值,一种是1,一种是0,或者说“是”或“否”的这种判断。
这里面的wx+b和前面线性回归中所说的wx+b是一个概念,都是指一个w矩阵和x做了内积再和偏置b做了一个加和。如果设z=wx+b那么这个回归的分类模型表达式就可以改写为:
函数图像为:
横轴是z,纵轴是y,一个多维的x经过这样两次映射后最后投射在y上是一个取值只有1和0二项分布。也就是我们前面说的产生了一个“是”或“否”的分类。
训练的过程跟普通线性回归也是一样的,只不过损失函数的形式不同。但是,它的损失函数的含义仍旧是表示这种拟合残差与待定系数的关系,并通过相应的手段进行迭代式的优化,最后通过逐步调整待定系数减小残差。逻辑回归的表达式的定义本源是来自于伯努利分布的,后面我们也会有相对详细的说明,这里先做一个感性认识。
三、分类
分类是我们在利用机器学习中使用的最多的一大类算法,我们通常也喜欢把分类算法叫“分类器”。
这个说法其实也非常形象,在我们看来,这就是一个黑盒子,有个入口,有个出口。我们在入口丢进去一个“样本”,在出口期望得到一个分类的“标签”。
比如,一个分类器可以进行图片内容的分类标签,我们在“入口”丢进去一张老虎的照片,在“出口”得到“老虎”这样一个描述标签;而当我们在“入口”丢进去一张飞机的照片,在“出口”得到“飞机”这样一个描述标签,这就是一个分类器最为基本的分类工作过程。
一个分类器模型在它诞生(初始化)的时候其实是不具备这种功能的,而要让它具备这种功能只有通过给予它大量的图片以及图片所对应的标签分类,让它自己进行充分地总结和归纳,才能具备这样一种能力。
在刚刚看到的逻辑回归这种方式中我们已然看到了一些端倪。逻辑回归和普通的线性回归不同,它的拟合是一种非线性的方式。而最终输出“标签值”虽然是一种实数变量,而最终分类的结果却期望是一种确定的值“是”(1)或“不是”(0)。其他各种分类器的输出通常也是离散的变量,体现出来也多是非线性的分类特点。
我们在编写代码教会分类器怎么做学习的时候,其实是在教它如何建立一种输入到输出的映射逻辑,以及让它自己调整这种逻辑关系,使得逻辑更为合理。
而合理与否的判断也非常明确,那就是召回率和精确率两个指标——召回率指的是检索出的相关样本和样本库(待测对象库)中所有的相关样本的比率,衡量的是分类器的查全率。精确率是检索出的相关样本数与检索出的样本总数的比率,衡量的是分类器的查准率。
具体来说,譬如有一个1000个样本的训练集,是1000张照片,里面有200张是猫,200张是狗,600张是兔子,一共分成三类。我们将每个照片向量化后,加上它的标签
“猫”——“0”
“狗”——“1”
“兔子”——“2”
这相当于一个x和y的对应关系,把它们输入到训练集去训练(但是这个地方的标签0、1、2并不是实数定义,而是离散化的标签定义,通常习惯用one-hot独热编码的方式来表示)。经过多轮训练之后,分类器将逻辑关系调整到了一个相对稳定的程度,然后用这个分类器再对这200张猫,200张狗,600张兔子进行分类的时候。发现:
200张猫的图片中,有180张可以正确识别为猫,而有20张误判为狗。
200张狗的图片可以全部判断正确为狗。
600张兔子的图片中,有550张可以正确识别为兔子,还有30张被误判为猫,20张误判为狗。
你可不要觉得奇怪,在所有的机器学习或者深度学习训练的工程中,误判率几乎是没有办法消灭的,只能用尽可能科学的手段将误判率降低。不要太难为机器,其实人都没办法保证所有的信息100%正确判断,尤其是在图片大小、图片清晰程度、光线明暗悬殊的情况下,不是吗?那就更别说机器了,它更做不到。
我们还是来解释召回率和精确率的问题,就刚才这个例子来说,一共1000张图片中,200张是猫,但是只能正确识别出180张,所以猫的召回率是180÷200=90%,600张兔子中正确识别550张,所以兔子的召回率是550÷600≈91.7%,就这样计算。
而在1000中图片中,当我检索狗的时候会检索出240张狗的图片,其中有200张确实是狗,有20张是被误判的猫,还有20张是被误判的兔子,所以240张狗的图片中正确的仅有200张而已,那么狗的精确率为200÷240≈83.3%。怎么样,这两个概念不难理解吧。
分类的训练过程和回归的训练过程一样,都是极为套路化的程序。
第一,输入样本和分类标签。
第二,建立映射假说的某个y=f(x)的模型。
第三,求解出全局的损失函数Loss和待定系数w的映射关系,Loss=g(w)。
第四,通过迭代优化逐步降低Loss,最终找到一个w能满足召回率和精确率满足当前场景需要。注意这说的尤其指的是在验证数据集上的表现。
大家请注意这4个步骤,我们从前面最简单的机器学习的例子中已经总结出来一个最为有概括性的科学性流程。这种流程广泛使用,并且在其它机器学习的场景中也是可以顺利落地的。
分类器的训练和工作过程就是这个样子了,听起来分类器的工作过程非常简单,但是要知道人的智能行为其实就是一种非常精妙或者称为完美的分类器。他能够处理极为复杂,极为抽象的输入内容——不管是文字、声音、图像,甚至是冷、热、刺痛感、瘙痒感这种难以名状的刺激,并且能够在相当短的时间内进行合理的输出——例如对答、附和、评论,亦或是尖叫、大笑等各种喜怒哀乐的反应与表现。
从定义的角度上来说,人其实就是一种极为复杂的且极为智能的分类器。而我们在工业上使用的分类器则通常是非常片面的,偏门的,只研究一种或几个事物的“专业性”的分类器,这和我们人类的分类能力区别就太大了。
四、综合应用
到现在为止,我们看到的绝大多数的机器学习的应用环境都非常单纯——向量清洗到位,边界划定清晰。
例如,垃圾邮件的分拣,能够通过邮件内容的输入来判断邮件是否为垃圾邮件;新闻的自动分类,能够通过欣慰内容的分类来判断新闻的类别或描述内容的属性;摄像头对车牌号的OCR电子识别手写识别,这些应用可以通过输入一个图像来得到其中蕴含的文字信息向量,诸如此类等等,这些都是早些年应用比较成熟的领域,在这种应用场景中机器通过学习能够取代一些纯粹的体力劳动。
在近几年,随着计算机能力的提升,尤其是GPU并行计算的普及化,使得很多原来高密度计算的场景变得门槛越来越低,人们在商用领域已经开始寻找用深度学习的网络来做一些原来不可想象的事情。
例如这种使用卷积神经网络对照片进行风格处理,拿一张输入的普通照片,再拿一张有着较强艺术风格的绘画作品,然后通过卷积网络进行处理,最后由计算机“创作”出一幅内容基于照片但是风格基于绘画作品的新作出来。而这种事情在几年前是难以想象的,因为这看上去太“智能”了,太有“创造力”了。
还有类似这种,我们输入一张照片,然后让计算机根据这张照片的风格和内容,凭空创造一张很像但不一样的照片出来。注意哦,这个跟Photoshop的功能可是完全不同的,它是全自动。在这些图中,右侧的图都是源图,左侧的图都是计算机生成的图,有水波纹、云朵、花丛、还有随意的艺术涂鸦。怎么样,有不少真的是可以以假乱真了吧。这都是使用深度神经网络处理的结果。
那么除此之外,像语音识别以及视频中存在物体的检出,这些内容也是属于近几年研究比较热门并逐渐趋于成熟的应用领域。实际上,在实现层面有很多种实现方式可以完成像这样的应用。
而在学术领域,也有一类新兴的基于深度学习神经网络的研究领域,叫做“对抗学习”可以实现类似的方式。在深度学习领域我们会使用“生成对抗网络”(Generative Adversial Network),这种网络的特点就是可以进行复杂内容的生成,而非生成一个标签这么简单。
网友评论