K近邻
K近邻(KNN)是一种最经典和简单的有监督学习方法之一。当对数据的分布只有很少或者没有任何先验知识时,K近邻算法是一个很不错的选择。K近邻算法既能后用来解决分类问题,也能够用来解决回归问题。
原理
当对测试样本进行分类时,首先扫描训练集,找到与该测试样本最相似的k个训练样本,根据这k个样本的类别进行投票确定测试样本的类别。也可以通过k个样本与测试样本的相似程度进行加权投票。如果要输出测试样本属于各类的概率,可以通过属于各类的数量分布来进行估计。
示例:
假如样本分为正类和负类两种,分别用实心圆和实心三角形表示,现在给定一个预测样本a,我们需要对其标签进行预测。首先寻找a最近的6个样本,发现其中有4个是正类,2个是负类。a的近邻样本中正类多于负类,因此我们将a预测为正类。
算法流程
1.确定k的大小和距离计算的方法
距离计算方法详见距离计算方法
2.从训练样本中得到k个与测试样本最相似的样本
3.根据k个最相似训练样本的类别,通过投票的方式来确定测试样本的类别
核心问题
KNN算法三个核心问题:
1.通过何种方法寻找测试样本的近邻,即如何计算样本之间的距离或相似度;
2.如何选择k值的大小才能达到最好的预测效果;
3.当训练集样本数量多或维度非常大时,如何更快地进行预测.
1.距离
2.k的选择
在KNN算法中,不同的k值选择对最终结果会产生影响。下图中,k=3和k=6时,同一个预测样本会被分类到不同的类别中。
一般而言,从k=1开始,随着k的逐渐增大,K近邻算法的分类效果会逐渐提升,在增大到某个值后,随着进一步增大,K近邻算法的分类效果会逐渐下降。当k增大到与训练样本数量相等时,K近邻算法对每一个测试样本的预测结果将会变成相同的。对于一个具体的应用问题,确定最优的k是一件困难的事情,往往需要通过交叉验证等方法评估模型在不同取值下的性能,进而确定具体问题的k值。
3.提高预测性能
从预测单个测试样本的角度看,测试样本需要与训练集中的每一个训练样本进行距离计算,KNN算法在进行预测时的时间复杂度为O(n),当测试集样本有m个时,时间复杂度为O(mn)。所以KNN的预测时间性能很低,因此我们需要通过某种索引技术来缩短预测时间,从而提高预测性能。
一种方法是针对训练数据设计一种数据结构用于索引,对搜索空间进行层次划分。通过这种数据结构我们能够针对任意测试样本,以更快的速度搜索与其最相似的k个训练样本。
其中最常用的数据结构为k-d树(k维树),它是二叉搜索树在多维空间上的扩展. k-d树中的每一个内部节点保存两种信息:1)多维空间中的一个超立方体;2)一个与某一个维度垂直的超平面.通过每一个节点的超平面,将一个节点分割为两个子节点.当落在某一个节点的超立方体中的样本数少于给定阈值时,节点便不再进一步分裂.在K近邻算法中,k-d树的作用是对训练数据集构建索引,从而在预测时,能够快速找到与测试样本近似的样本。
在二维空间上,先与k1比较大小,从x1维度,将其分为两个区域,再在x2维度上,分别与k2、k3比较大小,将其划分成四个区域。这样一来,在搜索的时候仅需要判断两次,即可将某一测试样本归于a、b、c、d中的一类