KNN
KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方 法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
KNN复杂度分析
kNN算法本身简单有效,它是一种lazy-learning算法,分类器不需要使用训练集进行训练,训练时间复杂度为0。kNN分类的计算复杂度和训练集中的文档数目成正比,也就是说,如果训练集中文档总数为n,那么kNN的分类时间复杂度为O(n)。
KNN的使用
KNN算法不仅可以用于分类,还可以用于回归。通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成正比(组合函数)。
算法的优点:
1.简单,易于理解,易于实现,无需估计参数,无需训练
2.适合对稀有事件进行分类(例如当流失率很低时,比如低于0.5%,构造流失预测模型)
3.特别适合于多分类问题(multi-modal,对象具有多个类别标签),例如根据基因特征来判断其功能分类,kNN比SVM的表现要好
算法的不足:
1.当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。 该算法只计算“最近的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。
2.计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。
3. 懒惰算法,对测试样本分类时的计算量大,内存开销大,评分慢
4.可解释性较差,无法给出决策树那样的规则。
KNN常见的问题:
1、 k值设定为多大?
k太小,分类结果易受噪声点影响;k太大,近邻中又可能包含太多的其它类别的点。(对距离加权,可以降低k值设定的影响)
k值通常是采用交叉检验来确定(以k=1为基准)
经验规则:k一般低于训练样本数的平方根
2、类别如何判定最合适?
投票法没有考虑近邻的距离的远近,距离更近的近邻也许更应该决定最终的分类,所以加权投票法更恰当一些。
3、如何选择合适的距离衡量?
高维度对距离衡量的影响:众所周知当变量数越多,欧式距离的区分能力就越差。
变量值域对距离的影响:值域越大的变量常常会在距离计算中占据主导作用,因此应先对变量进行标准化。
4、训练样本是否要一视同仁?
在训练集中,有些样本可能是更值得依赖的。
可以给不同的样本施加不同的权重,加强依赖样本的权重,降低不可信赖样本的影响。
5、性能问题?
kNN是一种懒惰算法,平时不好好学习,考试(对测试样本分类)时才临阵磨枪(临时去找k个近邻)。
懒惰的后果:构造模型很简单,但在对测试样本分类地的系统开销大,因为要扫描全部训练样本并计算距离。
已经有一些方法提高计算的效率,例如压缩训练样本量等。
6、能否大幅减少训练样本量,同时又保持分类精度?
浓缩技术(condensing)
编辑技术(editing)
对噪声的处理
K-近邻算法是基于距离的局部最优的算法。不可否认的是,当数据中存在噪声时,局部最优的基于
距离的算法会受到明显的影响。虽然合适的参数k
能够减弱突发性的噪声数据对分类效果的影响。但当数据服从稳定的噪声模型时,其很难能够从实质上
解决此问题。在前人的工作中,一种普遍被接受的观
点是,如果训练数据集与测试数据集中存在相同的噪声模型,则噪声数据将会在训练数据和测试数据中起到相同的作用,因而可以忽略输入数据中的不确定
性。然而,文献[1]明确指出考虑输入数据的不确定
性,可以提高分类器的预测准确性。
如果对于类标签来说,所有条件属性是同等重要的,那么将条件属性值规范化于[0,1]区间后,欧基
里德距离在计算对象之问的距离时是相当成功的。然而这种假设也不尽然,数据集中的条件属性与类标
签之间不一定都是相关,且即使是与类标签之间是相关的,相关程度也不尽相同。朴素的K.近邻算法中。每一个数据所起到的作用是等价的明显存在漏洞。