假设我们已经利用一堆样本{(x,y)}进行了训练,得到了k个分类和k个分类的重心,那么对于待测数据x’,计算x’到k个分类重心的距离,距离最近的分类y‘即为x’的分类。这是最近邻策略的基本思路,从中衍生了k-means和KNN方法。如何度量距离是一个复杂的问题,一般情况下我们习惯使用欧氏距离来表征分类距离。如果我们要调整n个分类特征的权重,可以修改距离度量的定义;可以将n个分类特征变为特征的函数f(xn),从而衍生出高维特征。这里我们默认使用欧式距离。
K均值聚类(K-means):这个方法简单来说就是给定k个初始样本点作为k个起始集合(小黑洞),起始集合附近的样本点被吸引、合并形成新的更大的集合,然后以新集合的重心为中心重新吞并附近的样本点,直到最近两次的聚类中心没有太大变化或者达到最大迭代步数,从而把样本点集合分成k个集合。该方法的中心思路和EM算法大同小异。
K-means聚类方法的初始化,要求我们事先知道样本总体有多少个类别。选好起始的k个初始点,对结果有巨大影响。最简单的方法是随机取k个点,这个结果随机性太强。为了得到比较好的结果,我们可以寻找到彼此离得最远的k个数据点;此外也可以使用canopy和kmeans++方法进行初始化,这里不记录。
首先找到最远的两个点作为聚类点;接下来计算每个数据点与最近的聚类的距离,而不是每个数据点与所有聚类点距离的总和,然后找出距离最大的点作为第三个点;依次类推。不能使用当前点与所有聚类点的距离之和的原因如图:
可以看出,当前聚类点旁边的点,该点与其他所有聚类点的距离之和是最大的,但是该点与离其最近的聚类点的距离是最小的。与所有聚类点都离得比较远的点,该点与离其最近的聚类点的距离最大。
K最近邻分类法KNN:我们用足够的训练样本,通过诸如k-means的方法训练得到k个分类的重心和大致范围,如果待测数据x到第i个分类的距离最小,那么有理由认为x属于分类i。
《统计学习基础》介绍了一个应用最近邻策略的手写英文字符(256×256像素)识别方法,同时也说明距离度量的定义灵活性相当高。我们已经获取256×256像素标准的英文字符,然后对比手写字符和标准英文字符的匹配程度。手写字符可能与标准字符相比,可能有大有小有旋转,有一定扭曲,那么手写字符A到标准字符A的匹配程度可能还不如其他字符。这里书中引入不变性概念:如果我们将标准字符A进行放大缩小、旋转、扭曲变换,得到A的标准字符集,然后计算同样变换过的手写字符集A和B到标准字符集A的最大匹配程度,结果表明A肯定是比B高的。不变性最近邻方法的计算规模增加了几十倍,复杂度高,不过计算规模小于神经网络,正确率持平神经网络。
《统计学习基础》中还提到了自适应最近邻策略,这个策略会自适应变化每个已分类点的最近邻搜索范围,即精细地改变已分类集合往外合并样本点的规则。
https://github.com/artzers/MachineLearning.git Kmeans.py