数据挖掘概念与分析第九章笔记

原博主博客:https://blog.csdn.net/u014593570/article/details/75987793

本章学习数据分类的高级技术

贝叶斯信念网络

书上写的比较笼统,初学者可能会看的倒懂不懂的。因此,可以看看我在本章列出的参考文章。 
1.1摘要 
在上一篇文章中我们讨论了朴素贝叶斯分类。朴素贝叶斯分类有一个限制条件,就是特征属性必须有条件独立或基本独立(实际上在现实应用中几乎不可能做到完全独立)。当这个条件成立时,朴素贝叶斯分类法的准确率是最高的,但不幸的是,现实中各个特征属性间往往并不条件独立,而是具有较强的相关性,这样就限制了朴素贝叶斯分类的能力。这一篇文章中,我们接着上一篇文章的例子,讨论贝叶斯分类中更高级、应用范围更广的一种算法——贝叶斯网络(又称贝叶斯信念网络或信念网络)。 
考虑一个例子 
考虑一个使用朴素贝叶斯分类实现SNS社区中不真实账号的检测例子。在朴素贝叶斯分类的解决方案中,做了如下假设:

i、真实账号比非真实账号平均具有更大的日志密度、各大的好友密度以及更多的使用真实头像。
ii、日志密度、好友密度和是否使用真实头像在账号真实性给定的条件下是独立的。
  • 1
  • 2

但是,上述第二条假设很可能并不成立。一般来说,好友密度除了与账号是否真实有关,还与是否有真实头像有关,因为真实的头像会吸引更多人加其为好友。因此,我们为了获取更准确的分类,可以将假设修改如下:

i、真实账号比非真实账号平均具有更大的日志密度、各大的好友密度以及更多的使用真实头像。
ii、日志密度与好友密度、日志密度与是否使用真实头像在账号真实性给定的条件下是独立的。
iii、使用真实头像的用户比使用非真实头像的用户平均有更大的好友密度。
  • 1
  • 2
  • 3

上述假设更接近实际情况,但问题随之也来了,由于特征属性间存在依赖关系,使得朴素贝叶斯分类不适用了。既然这样,去寻找另外的解决方案。 
下图表示特征属性之间的关联: 
这里写图片描述 
上图是一个有向无环图(DAG),其中每个节点代表一个随机变量,而弧则表示两个随机变量之间的联系,表示指向结点影响被指向结点。不过仅有这个图的话,只能定性给出随机变量间的关系,如果要定量,还需要一些数据,这些数据就是每个节点对其直接前驱节点的条件概率,而没有前驱节点的节点则使用先验概率表示。 
例如,通过对训练数据集的统计,得到下表(R表示账号真实性,H表示头像真实性): 
这里写图片描述 
纵向表头表示条件变量,横向表头表示随机变量。上表为真实账号和非真实账号的概率,而下表为头像真实性对于账号真实性的概率。这两张表分别为“账号是否真实”和“头像是否真实”的条件概率表。有了这些数据,不但能顺向推断,还能通过贝叶斯定理进行逆向推断。例如,现随机抽取一个账户,已知其头像为假,求其账号也为假的概率: 
这里写图片描述
也就是说,在仅知道头像为假的情况下,有大约35.7%的概率此账户也为假。如果觉得阅读上述推导有困难,请复习概率论中的条件概率、贝叶斯定理及全概率公式。如果给出所有节点的条件概率表,则可以在观察值不完备的情况下对任意随机变量进行统计推断。上述方法就是使用了贝叶斯网络。

1.2贝叶斯网络的定义及性质 
有了上述铺垫,我们就可以正式定义贝叶斯网络了。 
一个贝叶斯网络定义包括一个有向无环图(DAG)和一个条件概率表集合。DAG中每一个节点表示一个随机变量,可以是可直接观测变量或隐藏变量,而有向边表示随机变量间的条件依赖;条件概率表中的每一个元素对应DAG中唯一的节点,存储此节点对于其所有直接前驱节点的联合条件概率。 
贝叶斯网络有一条极为重要的性质,就是我们断言每一个节点在其直接前驱节点的值制定后,这个节点条件独立于其所有非直接前驱前辈节点。 
这条特性的重要意义在于明确了贝叶斯网络可以方便计算联合概率分布。 
一般情况先,多变量非独立联合条件概率分布有如下求取公式: 
这里写图片描述 
而在贝叶斯网络中,由于存在前述性质,任意随机变量组合的联合条件概率分布被化简成 
这里写图片描述 
其中Parents表示xi的直接前驱节点的联合,概率值可以从相应条件概率表中查到。 
回想一下朴素贝叶斯的独立假设,实际上最直接的体现是在计算当中。同样你可以把这条性质看作是一种“补偿”。补偿贝叶斯网络不具有“独立性”。 
贝叶斯网络比朴素贝叶斯更复杂,而想构造和训练出一个好的贝叶斯网络更是异常艰难。但是贝叶斯网络是模拟人的认知思维推理模式,用一组条件概率函数以及有向无环图对不确定性的因果推理关系建模,因此其具有更高的实用价值。 
1.3贝叶斯网络的构造及学习 
构造与训练贝叶斯网络分为以下两步: 
1、确定随机变量间的拓扑关系,形成DAG。这一步通常需要领域专家完成,而想要建立一个好的拓扑结构,通常需要不断迭代和改进才可以。 
2、训练贝叶斯网络。如果不训练的,我们只能知道定性的网络,而不能定量。实际上这一步也就是要完成条件概率表(CPT表)的构造,如果每个随机变量的值都是可以直接观察的,像我们上面的例子,那么这一步的训练是直观的,方法类似于朴素贝叶斯分类。但是通常贝叶斯网络的中存在隐藏变量节点,那么训练方法就是比较复杂,例如使用梯度下降法。 
书上P257给出了简单的推导过程,省略了推导细节。希望了解推导细节的,可以参考这篇文章。 
点击这里查看 
实际上,可以用因果关系来解释贝叶斯网络。 
善有善报,恶有恶报。这一句可以理解为DAG图的构造 
不是不报,时候未到。这一句可以理解为条件概率表(不报的原因是时候未到,即概率) 
贝叶斯网络的实际例子 
点击这里查看

性能如何? 
贝叶斯网络已经广泛于临床,生物,征信等领域。其强大之处在于两点 
1.贝叶斯网络最强大之处在于从每个阶段结果所获得的概率都是数学与科学的反映,换句话说,假设我们了解了足够多的信息,根据这些信息获继而得统计知识,网络就会告诉我们合理的推断。 
2.贝叶斯网络最很容易扩展(或减少,简化),以适应不断变化的需求和变化的知识。 
PS:参考文章 
点击这里查看

神经网络

首先要明白这样一点:后向传播算法在多层前馈神经网络上学习 
对于新手来说,可能会以为后向传播算法就是神经网络。但实际上不是这样的,学习这一章节,特别重要的是要“知其然”和“知其所以然”。 
具体来说的话,就是要理解神经网络的思想和梯度下降法。理解了这两个之后,你就自然会明白为什么会选择BP算法来训练神经网络了(BP是计算梯度的利器!!!)。 
推荐反复参看这两篇文章,尤其是第二篇文章。强烈推荐进行反复阅读,对于把握整体结构和细节都有很大的帮助!!!
如何直观解释BP算法-胡逸夫的回答 
如何简单形象有趣的解释神经网络-YJango的回答 
前馈神经网络的结构 
神经网络之所以叫神经网络,是因为它模拟了人的大脑的神经单元的工作方式。(之前看到不少文章说神经网络算法和人的神经没有任何关系,这完全是瞎说。实际上该算法构造可以被看作受仿生学(?)启发的) 
神经网络有很多神经网络层构成,而每一层又由许多单元组成。第一层叫输入层,中间的各个层叫隐藏层,最后一层叫输出层。在这里要额外介绍的一点是:除了输出层,每一层都可以有一个偏置结点(这个在书书上省略了)。 
那么什么是偏置结点呢?实际上偏置结点是为了描述训练数据中没有的特征。偏置结点对于下一层的每一个结点的权重的不同而产生不同的偏置,于是可以认为偏置是每一个结点(除输入层外)的属性。 
更直白来说,偏置充当阀值,用来描述单元活性。 
而一般的书上都把这个偏置结点省略掉了的。 
这里写图片描述 
虽然图中隐藏层只画了一层,但其层数并没有限制。传统的神经网络通常只设置一层,而最近的深度学习则通常达到了上百层。 
这里写图片描述

在描述神经网络的BP训练算法之前,我们来看神经网络各层都有哪些属性 。 
1.除输入层以外,每一个神经单元都有一个输出值,定义为Oj; 
2.相邻层之间的结点的链接有一个权重W,其值在【-1,+1】之间; 
3.除输入层之外,每一层的各个节点都有一个输入值。其值为上一层所有单元的输出加权和加上偏置,定义为净输入; 
4.除输入层外,每一层都有一个偏置值,其值在【0,1】之间; 
5.除输入层外,每个结点的输出值等于该结点的净输入值作非线性变换,该变换所用函数被称为激活函数; 
6.我们通常认为输入层没有输入值。其输出值即为训练数据的属性,比如一条记录X={(1,2,3),类别1}。那么输入层的三个结点的输出值分别为1,2,3。因此输入层的结点个数一般等于训练数据的属性个数。

因此,训练一个BP神经网络,实际上就是调整网络的权重和偏置这两个参数。BP神经网络的训练过程分为两部分: 
1.前向反馈,逐层波浪式的传递输出值; 
2.逆向反馈,反向逐层调整权重和偏置。 
首先来看前向反馈。

前向反馈 
在训练网络前,我们需要随机初始化权重和偏置。对每一个权重取【-1,1】的一个随机实数,每一个偏置取【0,1】的一个随机实数,之前就进行前向传输。 
神经网络的训练是由多趟迭代完成的,每一趟迭代都使用训练集的所有记录,而每一次训练网络只使用一条记录。 
首先设置输入层的输出值,假设属性的个数为100,那我们就设置输入层的神经单元个数为100,输入层的结点Ni的初始值为记录第i维上的属性值xi。对输入层的操作就这么简单,之后的每层就要复杂一些了,除输入层外,其他各层的输入值是上一层输入值按权重累加的结果值加上偏置,每个结点的输出值等该结点的输入值作非线性变换。 
这里在作非线性变换时会涉及到激活函数。关于为什么要引入激活函数,会在之后详细说明,这里暂且先记下。 
这里写图片描述

前向传输的输出层的计算过程公式如下: 
这里写图片描述 
书P261有公式的详细解释。 
OK,对隐藏层和输出层的每一个结点都按照如上图的方式计算输出值,就完成前向传播的过程。

逆向反馈 
逆向反馈从最后一层即输出层开始,我们训练神经网络作分类的目的往往是希望最后一层的输出能够描述数据记录的类别,比如对于一个二分类的问题,我们常常用两个神经单元作为输出层,如果输出层的第一个神经单元的输出值比第二个神经单元大,我们认为这个数据记录属于第一类,否则属于第二类。 
第一次前向反馈时,整个网络的权重和偏置都是我们随机取,因此网络的输出肯定还不能描述记录的类别,因此需要调整网络的参数,即权重值和偏置值,而调整的依据就是网络的输出层的输出值与类别之间的差异,通过调整参数来缩小这个差异,这就是神经网络的优化目标。 
上面说到,调整的依据是网络输出层的输出值与类别之间的差异。这个差异是通过损失函数来计算的,而最终我们调整权重和偏置的目的就是为了最小化损失函数。 
由于网络的输出层有多个输出结点,我们需要将输出层每个输出结点的差值平方求和,于是得到每一个训练样例的损失函数为: 
这里写图片描述 
至于为什么要引入损失函数,这个也放在后面说。 
OK,书接上文。根据实例的输入,从前向后依次计算,得到输出层每个单元的输出。然后从输出层开始反向计算每一层的每个单元的误差项。 
对于输出层的每个单元,它的误差为: 
这里写图片描述 
对于隐藏层的每个单元,它的误差为: 
这里写图片描述 
 计算完各单元的误差之后,就可以利用误差对权重和偏置进行更新,首先看权重的更新: 
 这里写图片描述 
这里会涉及到一个“入”参数。这个参数被称为“学习率”,为什么要引入这个参数,也放在后面讲。 
更新完权重后,还需要更新偏置 
这里写图片描述 
书P262有关于公式的具体解释。 
OK,至此,我们完成了一次神经网络的训练过程,通过不断的使用所有数据记录进行训练,从而得到一个分类模型。不断地迭代,不可能无休止的下去,总归有个终止条件。

训练终止条件 
1.前一周期所有的权重的变化值都小于某个指定的阀值,则证明训练得差不多了,可以停止了; 
2.前一周期五分类的元组百分比小于某个阀值; 
3.超过指定的迭代次数。

为什要引入激活函数? 
我们知道神经网络可以用于分类(预测)和数值预测(预测连续值输出)。 
假如说,我们不运用激活函数的话,则输出就仅仅是一个简单的线性函数,整个神经网络就仅仅是一个线性回归模型 ,并且这个线性回归模型的执行效果还很差。 
我们希望我们的神经网络不仅仅可以学习和计算线性函数而且还可以承担比这复杂得多的任务,不仅能处理简单的数据类型还能处理诸如图像,音视频之类的复杂数据类型。它可以计算和学习任何函数,几乎我们可以想到的任何过程都可以表示为神经网络的函数计算。 
因此现在我们需要的是一个可以学习和表示几乎任何东西的神经网络模型,以及可以将输入映射到输出的任意复杂函数。 
而这而这一切都归结于这一点,我们需要应用激活函数f(x),以便使网络更加强大,增加它的能力,使它可以学习复杂的事物,复杂的表单数据,以及表示输入输出之间非线性的复杂的任意函数映射。 
直白理解就是,我们需要激活函数(非线性函数)来增强我们的神经网络的能力! 
神经网络强大到可以学习世界上任何的事物,所以必须引入非线性。 
事实上,我们的世界也就是非线性的。 
其他更细致的请参考下面的文章: 
什么是激活函数?它有什么作用? 
神经网络之激活函数

损失函数 
损失函数可以作为衡量参数修正优劣的指标。 
损失函数越小,其整个模型的性能就越好。 
在整个过程中,我们是通过比较预测值和目标值来不断修正权重的。 
那么如何进行比较呢?当然不是简单的相加相减。于是,这里就引出了损失函数 
在神经网络中,因为后向传播是使用梯度下降法来搜索权重的集合的,因此这里的损失函数通常采用的就是平方损失函数。 
实际上,损失函数并不止这一种 
参考文章机器学习中的损失函数

学习率 
在多层的神经网络中,误差曲面可能有多个局部极小值,这意味着使用梯度下降算法找到的可能是局部极小值(权重看上去收敛,但不是最优解),而不是全局最小值,为此引入了这一参数。 
此外,从全局来思考的话,BP采用梯度下降法来训练:通过使loss值向当前点对应梯度的反方向不断移动来降低loss,而一次移动多少就是由学习速率来决定的。 
这里写图片描述

性能如何? 
看看最近深度学习展现出来的强大就知道了。 
具体的看书上P264

总结 
纵观来看,BP算法的推导过程主要是利用梯度下降算法最小化损失函数的过程。 
其中我认为很重要很重要的是关于非线性(激活)函数的变换。或者更具体的来说是在前向传播中,从输入到净输入再到输出这一步。得益于这一系列的变换操作,就可以把复杂的非线性问题用简单的线性方法去解决。事实上,若是你了解了SVM的思想你会发现,在空间变换这一块,这两个算法的处理非常相似。都是通过非线性映射把原始数据变换到高维空间。 
本文旨在理清思路,因此省略了很多推导细节。 
本节参考借鉴引用了: 
如何直观地解释 back propagation 算法? 
数据挖掘系列(9)——BP神经网络算法与实践 
多层神经网络BP算法 原理及推导 
如何直观解释BP算法-胡逸夫的回答 
如何简单形象有趣的解释神经网络-YJango的回答

神经网络的动态模拟: 
Tensorflow

支持向量机

书上写得也很清楚,还可以查看一下这篇文章 
支持向量机(SVM)是什么?

使用频繁模式分类

P270

惰性学习法(或近邻分类)

前面提高的所有分类方法——决策树分类,贝叶斯分类,基于规则的分类,贝叶斯网络分类,神经网络分类,支持向量机分类和使用频繁模式的分类都是急切学习法的例子。 
何为急切学习法呢? 
回顾这些分类方法,都是在接受训练元组训练时期就已经构成了分类模型。 
而与之对应的惰性学习法则是直到对给定的检验元组分类之前的一刻才构造“分类模型”。 
大家要注意到我在这里对“分类模型”打上了引号,是因为这里说的“分类模型”不同于急切学习的那样。 
也就是说,当给定一个训练元组时,惰性学习法只对它进行简单的处理并存储它,然后一直等待。直到给定一个检验元组,它才进行泛化,以便根据与存储的训练元组的相似性对该元组进行分类。 
所以,惰性学习法的分类是以来与训练元组的相似性来判定的,因此这个分类模型不同于急切学习法的分类模型。 
所以,对急切学习法在花费大量时间和精力在训练上,惰性学习法则是花费大量时间和精力在分类和数值预测上。这意味着,惰性学习法在实际使用的时候计算开销可能会很大。你可以把它理解为平时不好好学习(训练),到了考试才临阵磨枪(预测或分类) 
KNN算法是惰性学习的典型例子

K-最近邻分类(KNN) 
KNN算法是基于类比学习的,即通过将给定的检验元组和它相似几个训练元组进行比较来学习。它可以用来分类和回归。由于这俩个都差不多,所以这里就选择分类来进行讲解。 
直白的理解就是,当我们分析一个人时,我们不妨观察和它最亲密的几个人(所谓近朱者赤近墨者黑)。 
回头看第一句话,我重点标注了“相似”和“几个”。实际上这两个就是KNN算法最核心的东西,即计算相似性核定K值。 
首先我们来看一个最最基本的实际例子(该例子参考了这篇文章)。 
考虑一个电影分类的例子。 
首先,我们准备电影分类的数据集。 
这里写图片描述 
可以看到,这里有12个数据,其数据类别为喜剧片,动作片,爱情片三类。使用的特征值为搞笑镜头,拥抱镜头和打斗镜头数量。现在来了一部新电影《唐人街探案》,如果使用KNN来进行分类,该怎么做呢? 
步骤如下: 
1.首先构建一个已经分好类的数据集

"宝贝当家": [45, 2, 9, "喜剧片"],  
"美人鱼": [21, 17, 5, "喜剧片"],  
"澳门风云3": [54, 9, 11, "喜剧片"],  
"功夫熊猫3": [39, 0, 31, "喜剧片"],  
"谍影重重": [5, 2, 57, "动作片"],  
"叶问3": [3, 2, 65, "动作片"],  
"伦敦陷落": [2, 3, 55, "动作片"],  
"我的特工爷爷": [6, 4, 21, "动作片"],  
"奔爱": [7, 46, 4, "爱情片"],  
"夜孔雀": [9, 39, 8, "爱情片"],  
"代理情人": [9, 38, 2, "爱情片"],  
"新步步惊心": [8, 34, 17, "爱情片"]}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2.计算新样本与数据集中所有样本的相似性 
这里会涉及到数据的归一化(规范数据以方便计算)和相似性的计算 
归一化的必要性后面再说。 
计算数据之间的相似性我们在第二章的2.4节(P44)就已经详细介绍过了,包括使用的数据结构(数据矩阵和相异性矩阵),以及标称属性,数值属性的相似性计算都详解在那里,不清楚的同学翻回去看看。 
这里我们选择最简单也是最常用的欧氏距离来依次计算新样本和数据集中所有样本的距离(相似性更确切的说是相异性),输出结果如下:

['谍影重重', 43.87]
['伦敦陷落', 43.42]
['澳门风云3', 32.14]
['叶问3', 52.01]
['我的特工爷爷', 17.49]
['新步步惊心', 34.44]
['宝贝当家', 23.43]
['功夫熊猫3', 21.47]
['奔爱', 47.69]
['美人鱼', 18.55]
['夜孔雀', 39.66]
['代理情人', 40.57]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

3.按照距离大小(相似性)递增排序

['我的特工爷爷', 17.49]
['美人鱼', 18.55]
['功夫熊猫3', 21.47]
['宝贝当家', 23.43]
['澳门风云3', 32.14]
['新步步惊心', 34.44]
['夜孔雀', 39.66]
['代理情人', 40.57]
['伦敦陷落', 43.42]
['谍影重重', 43.87]
['奔爱', 47.69]
['叶问3', 52.01]]  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

4.选取距离最小的K个样本 
因为欧式距离反应的是相异性,所以距离越小,则越相似。 
这里取K=5

['我的特工爷爷', 17.49]
['美人鱼', 18.55]
['功夫熊猫3', 21.47]
['宝贝当家', 23.43]
['澳门风云3', 32.14]]
  • 1
  • 2
  • 3
  • 4
  • 5

5.确定这K个样本所在类别出现的频率,并输出频率最高的类别 
因为KNN之前并不会在训练集中形成分类模型且是基于类比学习。因此,在拿到前K个数据之后,需要对这个K个数据所在的样本,计算它们的出现频率,从而得到出现频率最高的类别

('喜剧片', 4)
('动作片', 1)
('爱情片', 0)

输出“喜剧片”
  • 1
  • 2
  • 3
  • 4
  • 5

所以最后把《唐人街》探案归类为喜剧片。

OK,这就是最最基本的KNN的一套流程。 
其中,值得特别关注的有两点。 
一是K值到底取多大,二是数据归一化。 
1选取k值及它的影响?(此处参考了这篇文章) 
如果我们选取较小的k值,那么就会意味着我们的整体模型会变得复杂,容易发生过拟合 
假设K=1,且有训练数据和待分类点如下图: 
这里写图片描述 
上图中有俩类,一个是黑色的圆点,一个是蓝色的长方形,现在我们的待分类点是红色的五边形。 
好,根据我们的k近邻算法步骤来决定待分类点应该归为哪一类。我们由图中可以得到,很容易我们能够看出来五边形离黑色的圆点最近,k又等于1,那太好了,我们最终判定待分类点是黑色的圆点。 
由这个处理过程我们很容易能够感觉出问题了,如果k太小了,比如等于1,那么模型就太复杂了,我们很容易学习到噪声,也就非常容易判定为噪声类别,而在上图,如果,k大一点,k等于8,把长方形都包括进来,我们很容易得到我们正确的分类应该是蓝色的长方形!如下图: 
这里写图片描述 
所谓的过拟合就是在训练集上准确率非常高,而在测试集上准确率低,经过上例,我们可以得到k太小会导致过拟合,很容易将一些噪声(如上图离五边形很近的黑色圆点)学习到模型中,而忽略了数据真实的分布! 
看下面这两张图看得更明显。 
这里写图片描述 
这里写图片描述

如果我们选取较大的k值,就相当于用较大邻域中的训练数据进行预测,这时与输入实例较远的(不相似)训练实例也会对预测起作用,使预测发生错误,k值的增大意味着整体模型变得简单。 
举个例子,如果k=N(N为训练样本的个数),那么无论输入实例是什么,都将简单地预测它属于在训练实例中最多的类。这时,模型是不是非常简单,这相当于你压根就没有训练模型呀!直接拿训练数据统计了一下各个数据的类别,找最大的而已!这好像下图所示: 
这里写图片描述 
我们统计了黑色圆形是8个,长方形个数是7个,那么如果k=N,我就得出结论了,红色五边形是属于黑色圆形的(明显是错误的!) 
这个时候,模型过于简单,完全忽略训练数据实例中的大量有用信息,是不可取的。 
恩,k值既不能过大,也不能过小,在我举的这个例子中,我们k值的选择,在下图红色圆边界之间这个范围是最好的,如下图: 
这里写图片描述 
(注:这里只是为了更好让大家理解,真实例子中不可能只有俩维特征,但是原理是一样的1,我们就是想找到较好的k值大小)

那么我们一般怎么选取呢?李航博士书上讲到,我们一般选取一个较小的数值,通常采取 交叉验证法来选取最优的k值。(也就是说,选取k值很重要的关键是实验调参,类似于神经网络选取多少层这种,通过调整超参数来得到一个较好的结果)

2.特征归一化的必要性 
首先举例如下,我用一个人身高(cm)与脚码(尺码)大小来作为特征值,类别为男性或者女性。我们现在如果有5个训练样本,分布如下:

A [(179,42),男] B [(178,43),男] C [(165,36)女] D [(177,42),男] E [(160,35),女]

通过上述训练样本,我们看出问题了吗?

很容易看到第一维身高特征是第二维脚码特征的4倍左右,那么在进行距离度量的时候,我们就会偏向于第一维特征。这样造成俩个特征并不是等价重要的,最终可能会导致距离计算错误,从而导致预测错误。口说无凭,举例如下:

现在我来了一个测试样本 F(167,43),让我们来预测他是男性还是女性,我们采取k=3来预测。

下面我们用欧式距离分别算出F离训练样本的欧式距离,然后选取最近的3个,多数类别就是我们最终的结果,计算如下: 
这里写图片描述 
由计算可以得到,最近的前三个分别是C,D,E三个样本,那么由C,E为女性,D为男性,女性多于男性得到我们要预测的结果为女性。

这样问题就来了,一个女性的脚43码的可能性,远远小于男性脚43码的可能性,那么为什么算法还是会预测F为女性呢?那是因为由于各个特征量纲的不同,在这里导致了身高的重要性已经远远大于脚码了,这是不客观的。所以我们应该让每个特征都是同等重要的!这也是我们要归一化的原因!归一化公式如下: 
这里写图片描述

KNN算法小结 
  KNN算法是很基本的机器学习算法了,它非常容易学习,在维度很高的时候也有很好的分类效率,因此运用也很广泛,这里总结下KNN的优缺点。 
    KNN的主要优点有: 
    1) 理论成熟,思想简单,既可以用来做分类也可以用来做回归 
    2) 可用于非线性分类 
    3) 训练时间复杂度比支持向量机之类的算法低,仅为O(n) 
    4) 和朴素贝叶斯之类的算法比,对数据没有假设,准确度高,对异常点不敏感 
    5) 由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合 
    6)该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分 
    7)适合对稀有事件进行分类 
    8)特别适合于多分类问题(multi-modal,对象具有多个类别标签),例如根据基因特征来判断其功能分类,kNN比SVM的表现要好 
     
    

    KNN的主要缺点有:

    1)计算量大,尤其是特征数非常多的时候

    2)样本不平衡的时候,对稀有类别的预测准确率低

    3)KD树,球树之类的模型建立需要大量的内存

    4)使用懒散学习方法,基本上不学习,导致预测时速度比起逻辑回归之类的算法慢

    5)相比决策树模型,KNN模型可解释性不强

参考文章 
KNN算法理解 
【数学】一只兔子帮你理解 kNN 
【量化课堂】kd 树算法之思路篇 
一文搞懂k近邻(k-NN)算法(一) 
一文搞懂k近邻(k-NN)算法(二)

基于案例的推理(CBR) 
点击这里查看参考文章

遗传算法

遗传算法是一种利用自然进化的思想来设计的算法。它通过模拟自然进化过程来搜索最优解。 
参看下面连接中的文章。 
如何通俗易懂地解释遗传算法?有什么例子?-谢凌森 
如何通俗易懂地解释遗传算法?有什么例子?-sjyan

在实际中,一个问题是否能够使用遗传算法去解决,关键在于下面几点: 
1.现实问题的解如何映射到遗传算法的个体上? 
2.如何确定一个评估函数? 
3.如何确定选择算子,交叉算子,变异算子?

来看一些实际的例子

遗传算法有哪些有趣的应用

其他的

其他的,包括粗糙集方法,模糊集方法,迁移学习等看书就行了

猜你喜欢

转载自blog.csdn.net/Phoenix_tgd/article/details/82284224