1.算法思想
K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的有监督方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
KNN算法不仅可以用于分类,还可以用于回归。通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成正比(组合函数)
2.算法步骤
step.1---初始化距离为最大值
step.2---计算未知样本和每个训练样本的距离dist
step.3---得到目前K个最临近样本中的最大距离maxdist
step.4---如果dist小于maxdist,则将该训练样本作为K-最近邻样本
step.5---重复步骤2、3、4,直到未知样本和所有训练样本的距离都算完
step.6---统计K-最近邻样本中每个类标号出现的次数
step.7---选择出现频率最大的类标号作为未知样本的类标号
3.算法的重点
该算法涉及3个主要因素:训练集、距离或相似的衡量、k的大小。
3.1参数K的选取
如何选择一个最佳的K值取决于数据。一般情况下,在分类时较大的K值能够减小噪声的影响,但会使类别之间的界限变得模糊。一般使用试探法获得较好的k。k太小,分类结果易受噪声点影响;k太大,近邻中又可能包含太多的其它类别的点。(对距离加权,可以降低k值设定的影响)
3.2距离和相似性度量
距离相似性度量有很多种,依情况而定。具体参考:参考:。但对于文本分类来说,使用余弦(cosine)来计算相似度就比欧式(Euclidean)距离更合适。
3.3参考集的选取
在训练集中,有些样本可能是更值得依赖的。可以给不同的样本施加不同的权重,加强依赖样本的权重,降低不可信赖样本的影响。在参考集过大的情况下,常对参考集进行剪辑,以提高泛化能力。
(1)剪辑法
两分剪辑近邻法
考虑两类情况。分三步设计:
第一步,将样本集XN随机划分为两个集合XNT和XNR,前者为考试集,后者为参考集。其中NT+NR=N,N为总的样本数。定义参数a,满足(NT/N=a)。当N足够大的时候,a<<1-a。
第二步,对XNT进行剪辑,利用XNR作为参考集对XNT进行近邻分类,剔去被错误分类的样本,剩下XNTE。
第三步,将XNTE作为参考集对未知样本近邻分类
多重剪辑近邻法
第一步,将样本集随机划分为s个子样本,即
第二步,用最近邻法,以为参考集,对中的样本进行分类,其中i=1,2,…,s,(i+1)Mod(s)表示i+1对s求模。
第三步,去掉在第二步中被错分的样本。
第四步,去掉所有留下的样本,构成的新的样本集。
第五步,经过k次迭代,再没有样本被剪辑掉则停止,否则转第一步。
二分近邻剪辑法保证在不影响决策面的情况下,保持样本“干净”和存储量降低。总体上,剪辑法一般剔去了边缘的点。但是,无效的数据大量存在。
(2)压缩近邻法
通常情况而言。剪辑的结果只是去掉了两类边界附近的样本,而靠近两类中心的样本几乎没有被去掉。按照近邻规则,这些样本中的大多数对于分类决策并没有什么好处,因此在剪辑的基础上,再去掉一部分这样的样本有助于进一步缩短计算时间和降低存储要求。即所谓的压缩近邻法,步骤如下:
第一步,对剪辑以后的样本设置两个存储器Store和grabbag。
第二步,从样本随机属于各类的一个样本放入store中。剩下的样本放入grabbag中。
第三步,以store中的样本作为参考集对grabbag中的样本遍历分类,若正确分类则舍弃该样本,若错误分类,将其放入store中。
第四步,以store中的样本作为参考集对未知样本分类。
压缩紧邻法产生的参考集一般位于交叉位置,产生的结果类似与SVM中的支撑矢量。 实际上,剪辑法和压缩法可以联合使用,以提高性能。3.4结论
1.经验误差和泛化能力是不可兼得的特性。通过二分剪辑法,重复剪辑法,压缩剪辑法降低参考集样本个数时,损失了影响分类结果的有用信息,必然造成分类准确率下降。即计算负载和存储量的降低,泛化能力好实际是以经验误差增大为代价的。
2.压缩近邻法可以在显著的降低存储量和增大推广性的情况下,以较小的经验误差的影响维持较好的分类性能。
3.影响分类错误的点往往是不“干净”也就是边缘模糊点造成的,因此对未知样本的预处理,或者探索降低测量误差的机制,能够提高分类器的性能。
4.性能分析
kNN是一种懒惰算法,平时不好好学习,考试(对测试样本分类)时才临阵磨枪(临时去找k个近邻)。懒惰的后果:构造模型很简单,但在对测试样本分类地的系统开销大,因为要扫描全部训练样本并计算距离。
(1)多数情况下表现良好。分类错误率不超过最优贝叶斯的2倍,理论上会渐渐收敛至贝叶斯错误率。
(2)较大的存储和计算代价。
weka的IBk函数实现了上述算法,并且还允许用户从多种距离加权的方法进行选择,而且提供了一个选项以借助交叉验证来自动确定k值。