机器学习经典算法【第一话】:KNN,K-means
原理:KNN算法——机器学习的门口:
首先,我们要区分KNN和K-means算法,KNN是分类算法,而K-means是聚类算法。
什么为之分类,什么为之聚类?
分类
好比我们已经知道一堆豆子里面有黄豆,红豆,绿豆三种,但我们有新的豆子,需要知道新的豆子属于哪一种,现在我们把豆子和已知的这堆豆子比对,这颗新豆子和哪种类型的豆子相似,那么我们就认定这颗新豆子属于哪一类,这叫分类。有点像近朱者赤近墨者黑的道理。
聚类
而所谓聚类,就好比一堆豆子各种混再一起了,现在我们还不知道这堆豆子有多少类,我们需要定义类别把这堆豆子分出类来。
KNN是输入基于实例的学习,属于懒惰学习,即KNN没有显式的学习过程,也就是说没有训练阶段,数据集事先已有了分类和特征值,待收到新样本后直接进行处理。
KNN是通过测量不同特征值之间的距离进行分类。
算法的描述:
1)计算测试数据与各个训练数据之间的距离;
2)按照距离的递增关系进行排序;
3)选取距离最小的K个点;
4)确定前K个点所在类别的出现频率;
5)返回前K个点中出现频率最高的类别作为测试数据的预测分类
经典示例
我们要确定绿点属于哪个颜色(红色或者蓝色),要做的就是选出距离目标点距离最近的k个点,看这k个点的大多数颜色是什么颜色。当k取3的时候,我们可以看出距离最近的三个,分别是红色、红色、蓝色,因此得到目标点为红色。
K的取值
K:临近数,即在预测目标点时取几个临近的点来预测。
- 如果当K的取值过小时,一旦有噪声将会对预测产生比较大影响
- K值的增大就意味着整体的模型变得简单,可以想象:K=所有样本数量的时候
- K的取值尽量要取奇数,以保证在计算结果最后会产生一个较多的类别,如果取偶数可能会产生相等的情况,不利于预测。
常用的方法是从 k=1 开始,使用检验集估计分类器的误差率。重复该过程,每次K增值1,允许增加一个近邻。选取产生最小误差率的K。
一般k的取值不超过20,上限是n的开方,随着数据集的增大,K的值也要增大。
KNN评价
KNN对于随机分布的数据集分类效果较差,对于类内间距小,类间间距大的数据集分类效果好,而且对于边界不规则的数据效果好于线性分类器。
KNN对于样本不均衡的数据效果不好,需要进行改进。改进的方法时对k个近邻数据赋予权重,比如距离测试样本越近,权重越大。
KNN很耗时,时间复杂度为O(n),一般适用于样本数较少的数据集,当数据量大时,可以将数据以树的形式呈现,能提高速度,常用的有kd-tree和ball-tree。
===============================
原理:K-means算法
前面提到,K-means属于聚类算法,把一堆混再一起的豆子进行分类。
算法的描述:
1)选取多个随机的类别中心点(后面会讲怎样选择)
2)计算所有样本点到所有类别中心点的距离(这里默认使用欧式距离)
3)然后对于每个样本而言选出距离自己最近的那个样本中心,则把自己划分到那类
4)校正样本中心
5)迭代重复 2,3 步,直到收敛(也就是样本中心基本不发生变化的时候)
例子
假如现在我们有一堆二维的点分布如下,假如我们想把它分成三类。那么首先我们锚定三个随机的样本类别中心。
经过第一次迭代之后(对于每个样本而言选出距离自己最近的那个样本中心,则把自己划分到那类)
我们要对样本中心进行校正。
如下图:
校正样本中心之后:
之后不断重复迭代,直到样本中心不再发生大规模偏移,则可认定为收敛,判定为训练完毕。我们需要的就是最后训练出来的所有样本中心。
最初的样本中心选择对结果的影响
假如开始的样本中心都选择在一个距离差不多的地方,容易造成局部最优的现象(局部过度分类)
关于最初始所有样本中心的选择
-
方法1:多次Random
取多次随机值,利用概率来把几个样本中心打散。 -
方法2:最远选取
先随机选取 K1,然后遍历所有的点,选取最远的作为 K2,(为避免噪声的影响,也可以选择倒数远几个作为 K2)。然后如法炮制,保持剩下的K3,4,5…两两之间距离差不多