kNN算法
算法概述
kNN算法又称为k近邻分类(k-nearest neighbor classification)算法,可以解决分类和回归的问题。kNN算法主要是通过距离判定出训练集中离待测样本最近的k个样本,然后统计这k个样本的类别,次数最多的类别或加权后距离最小的点的类别为新数据的类别。距离越近,类别判定的准确度越高。
算法原理
kNN算法有3个主要因素:训练集、距离衡量、k值。
训练集少且种类少的时候算法有效,训练集大的时候要使用KD树和球树的方法建立模型。
距离衡量的方法有多种,目的都是搜索最近邻,最常用的是欧氏距离。
k值决定了最后确定类别时所参考的样本数量,k值过大则训练误差增大,选取的临近点中包含错误种类的可能性增大,导致结果不准确;k值过小则泛化误差增大,模型容易受到噪声干扰,容易过度拟合。因此k值的选取非常重要,一般先选取一个很小的值,再使用交叉检验确定最优的k值,一般都低于训练样本的平方根。
算法步骤如下所示:
-
计算距离:给出训练集数据和待测样本数据,计算待测样本离训练集中每个样本的距离
计算距离的方法有很多,常用的有欧氏距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离和余弦距离等,其中对于数字类型的样本来说最常用的是欧式距离,文本分类时最常用余弦距离。
欧氏距离:也称欧几里得度量,是最常用的距离表示的方法,即在n维空间中,两点
和
之间的距离为:
当每个维度的度量不相同时会导致结果的不准确,例如将第一维度为某一条微博的转发量,第二维度为其评论量,第三维度为其点赞量时,因为点赞量一般比转发量、评论量大很多倍,因此计算过程中转发评论量显示出的类别差异可能会被点赞量所掩盖,因此当维度度量差异大时我们会先分别针对每个维度进行标准化消除这种差异带来的误差。
-
找k个最近样本:给定k值,根据求出的距离选定距离最近的k个样本
利用交叉检验确定最优的k值,即将数据临时分为训练集和测试集,从k=1开始测试,最大不能超过样本数据的平方根,从中选出效果最好的k值。 -
定类别:根据最近的k个样本的类别,确定待测样本的类别
一般有两种方法确定类别:第一,类别定为k个样本中出现次数最多的类别;第二,距离加权法,在k个样本中,权重为距离平方的倒数,每个点都赋值为1,对相同种类的点进行加权求和,最后值最大的种类为待测样本的种类。
当数据量非常大或特征特别多时,一般使用KD树或球树法建模。
优缺点
1、 优点
简单易懂,易于实现,无需估计参数和反腐训练;适合对稀有事件进行分类;
特别适合于多分类问题(multi-modal,对象具有多个类别标签),例如根据基因特征来判断其功能分类,kNN比SVM的表现要好
2、缺点
kNN是懒惰算法,没有提前训练,输入待测样本时才选定k个最近样本,对测试样本分类时的计算量大,要从头开始计算每个样本离待测样本的距离,速度慢;可解释性较差,无法给出决策树那样的规则。
应用
在文件data111.txt中我们有40个点的坐标,其分别属于0,1,2,3类,类别数据储存在文件data2.txt中