分类-K近邻

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中的一类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值