kNN与Kmeans算法学习
kNN和Kmeans在初学者学习过程中,可能会产生一些混淆,趁着复习阶段在博客总结一下,学习到的和总结的知识点。
首先需要知道,kNN和Kmeans的最重要区别:
- kNN算法是分类算法,分类算法肯定是需要有学习语料,然后通过学习语料的学习之后的模板来匹配我们的测试语料集,将测试语料集合进行按照预先学习的语料模板来分类
- Kmeans算法是聚类算法,聚类算法与分类算法最大的区别是聚类算法没有学习语料集合。
kNN(K-Nearest Neighbor)介绍
算法思路:如果一个样本在特征空间中k个最相似(即特征空间中“距离”最临近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
举个栗子:
从上图中我们可以看到,图中的数据集是良好的数据,即都打好了label,一类是蓝色的正方形,一类是红色的三角形,那个绿色的圆形是我们待分类的数据。
kNN的算法过程大致如下:
- 如果K=3,那么离绿色点最近的有2个红色三角形和1个蓝色的正方形,这3个点投票,于是绿色的这个待分类点属于红色的三角形
- 如果K=5,那么离绿色点最近的有2个红色三角形和3个蓝色的正方形,这5个点投票,于是绿色的这个待分类点属于蓝色的正方形
所以kNN本质是基于一种数据统计的方法。 kNN是一种memory-based learning,也叫instance-based learning,属于lazy learning。即它没有明显的前期训练过程,而是程序开始运行时,把数据集加载到内存后,不需要进行训练,就可以开始分类了。
所以在新数据进入模型判断类别时,模型会计算所有已有数据点与新数据的“距离”,并根据距离大小进行排序,采取一种投票的方式,来判断新数据属于什么类别。
通过上述讲解,可以看出,kNN没有训练过程,但在预测时,会很慢,并且对异常值不敏感(因为异常值会排到很靠后的名次,用不上)。
Kmeans介绍
算法思路:与kNN和已有数据点相比,KMeans是在找一个“中心”。而K,就是K个中心。它把n个对象根据他们的属性分为K个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。
如图所示,数据样本用圆点表示,每个簇的中心点用叉叉表示。
(a) 刚开始时是原始数据,杂乱无章,没有label,看起来都一样,都是绿色的。
(b) 假设 数据集可以分为两类,令K=2,随机在坐标上选两个点,作为两个类的中心点。
(c-f) 演示了聚类的两种迭代。先划分,把每个数据样本划分到最近的中心点 那一簇;划分完后,更新每个簇的中心,即把该簇的所有数据点的坐标加起来去平均值。这样不断进行”划分—更新—划分—更新”,直到每个簇的中心不在移动为 止。
那么如何定义“距离”,就可以使用很多种度量方式了,例如:
- 欧式距离(Euclidean Distance)
- 曼哈顿距离(Manhattan Distance)
- 闵科夫斯基距离(Minkowski Distance)
问题来了,既然上面说到,使用K个中心来聚类,那么K怎么选?
这个说实话没有特别的好方法,一般是经验或者是实验得出。
好不容易选出来K是多少了,初始的K放在哪里?
对于KMeans来说,不同的初始聚类中心可能导致完全不同的聚类效果,于是K-Means++算法就诞生了。
K-Means++ 介绍
算法思路:K-Means++的诞生主要是因为上述的第二个问题,即初始聚类中心怎么选?
选取初始聚类中心的思路:
- 从输入的数据点集合中随机选择一个点作为第一个聚类中心(与KMeans随便选不同)
- 对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x)
- 选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大
- 重复2和3直到k个聚类中心被选出来
- 利用这k个初始的聚类中心来运行标准的k-means算法
从上面的思路可以看出来,关键在于如何重复生成K-1个聚类中心,这里面概率如何设置,这里提供一种思路:
- 先从我们的数据库随机挑个随机点当“种子点”
- 对于每个点,我们都计算其和最近的一个“种子点”的距离D(x)并保存在一个数组里,然后把这些距离加起来得到Sum(D(x))。
- 然后,再取一个随机值,用权重的方式来取计算下一个“种子点”。这个算法的实现是,先取一个能落在Sum(D(x))中的随机值Random,然后用Random -= D(x),直到其<=0,此时的点就是下一个“种子点”。
- 重复2和3直到k个聚类中心被选出来
- 利用这k个初始的聚类中心来运行标准的k-means算法
上面加粗的地方不好理解,我举个例子:
例如当前有4个D(x)较大的数(这4个数分别叫A, B, C, D)其中,B离当前最近的聚类中心的距离是20,比ACD三点都要远,所以B当选新聚类中心的概率也越大,random可以理解为一个0~1的随机数,然后Sum(D(x))*Random,看得出的结果是多少。其实就像是一个筛子往这四个盒子里扔,B占的地方大,几率高。
相关实现:点我
总结:
两者区别
kNN
- kNN是分类算法,监督学习,喂给它的数据集是带label的数据,已经是完全正确的数据
- 没有明显的前期训练过程,属于memory-based learning
- K的含义:来了一个样本x,要给它分类,即求出它的y,就从数据集中,在x附近找离它最近的K个数据点,这K个数据点,类别c占的个数最多,就把x的label设为c
KMeans
- KMeans是聚类算法,非监督学习,喂给它的数据集是无label的数据,是杂乱无章的,经过聚类后才变得有点顺序,先无序,后有序
- 有明显的训练过程(聚类中心的改变)
- K的含义:K是人工固定好的数字,假设数据集合可以分为K个簇,由于是依靠人工定好,需要一点先验知识
两者联系
都包含这样的过程,给定一个点,在数据集中找离它最近的点。即二者都用到了NN(Nears Neighbor)算法,一般用KD树来实现NN。