【机器学习】K-近邻算法


K-近邻算法

1.K-近邻算法简介

1.1 定义

如果⼀个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的⼤多数属于某⼀个类别,则该样本也属于这个类别。

1.2 KNN算法流程

1)计算已知类别数据集中的点与当前点之间的距离

2)按距离递增次序排序

3)选取与当前点距离最⼩的k个点

4)统计前k个点所在的类别出现的频率

5)返回前k个点出现频率最⾼的类别作为当前点的预测分类

常⻅距离公式

  • 欧式距离(Euclidean Distance): 通过距离平⽅值进⾏计算

  • 曼哈顿距离(Manhattan Distance): 通过距离的绝对值进⾏计算

  • 切⽐雪夫距离 (Chebyshev Distance): 维度的最⼤值进⾏计算

  • 闵可夫斯基距离(Minkowski Distance): 当p=1时,就是曼哈顿距离; 当p=2时,就是欧⽒距离; 当p→∞时,就是切⽐雪夫距离。

2.K-近邻算法优缺点汇总

优点:

  • 简单有效
  • 重新训练的代价低
  • 适合类域交叉样本
    • KNN⽅法主要靠周围有限的邻近的样本,⽽不是靠判别类域的⽅法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN⽅法较其他⽅法更为适合。
  • 适合⼤样本⾃动分类
    • 该算法⽐较适⽤于样本容量⽐较⼤的类域的⾃动分类,⽽那些样本容量较⼩的类域采⽤这种算法⽐较容易产⽣误分

缺点:

  • 惰性学习
    • KNN算法是懒散学习⽅法(lazy learning,基本上不学习),⼀些积极学习的算法要快很多
  • 类别评分不是规格化
    • 不像⼀些通过概率评分的分类
  • 输出可解释性不强
    • 例如决策树的输出可解释性就较强
  • 对不均衡的样本不擅⻓
    • 当样本不平衡时,如⼀个类的样本容量很⼤,⽽其他类样本容量很⼩时,有可能导致当输⼊⼀个新样本 时,该样本的K个邻居中⼤容量类的样本占多数。该算法只计算“最近的”邻居样本,某⼀类的样本数量很 ⼤,那么或者这类样本并不接近⽬标样本,或者这类样本很靠近⽬标样本。⽆论怎样,数量并不能影响运 ⾏结果。可以采⽤权值的⽅法(和该样本距离⼩的邻居权值⼤)来改进。
  • 计算量较⼤
  • ⽬前常⽤的解决⽅法是事先对已知样本点进⾏剪辑,事先去除对分类作⽤不⼤的样本。

3.kd树

根据KNN每次需要预测⼀个点时,我们都需要计算训练数据集⾥每个点到这个点的距离,然后选出距离最近的k个点进⾏投票。当数据集很⼤时,这个计算成本⾮常⾼。
为了避免每次都重新计算⼀遍距离,算法会把距离信息保存在⼀棵树⾥,这样在计算之前从树⾥查询距离信息, 尽量避免重新计算。其基本原理是,如果A和B距离很远,B和C距离很近,那么A和C的距离也很远。有了这个信息, 就可以在合适的时候跳过距离远的点。

3.1 kd树的构建过程

1.构造根节点

2.通过递归的⽅法,不断地对k维空间进⾏切分,⽣成⼦节点

3.重复第⼆步骤,直到⼦区域中没有示例时终⽌

需要关注细节:a.选择向量的哪⼀维进⾏划分;b.如何划分数据

第⼀个问题简单的解决⽅法可以是随机选择某⼀维或按顺序选择,但是更好的⽅法应该是在数据⽐较分散的那⼀维进⾏ 划分(分散的程度可以根据⽅差来衡量)。

第⼆个问题中,好的划分⽅法可以使构建的树⽐较平衡,可以每次选择中位数来进⾏划分。

3.2 kd树的搜索过程

1.⼆叉树搜索⽐较待查询节点和分裂节点的分裂维的值,(⼩于等于就进⼊左⼦树分⽀,⼤于就进⼊右⼦树分 ⽀直到叶⼦结点)

2.顺着“搜索路径”找到最近邻的近似点

3.回溯搜索路径,并判断搜索路径上的结点的其他⼦结点空间中是否可能有距离查询点更近的数据点,如果有 可能,则需要跳到其他⼦结点空间中去搜索

4.重复这个过程直到搜索路径为空

4.交叉验证

交叉验证:将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成4份,其中⼀份作为验证集。然后经过4次 (组)的测试,每次都更换不同的验证集。即得到4组模型的结果,取平均值作为最终结果。⼜称4折交叉验证。

在这里插入图片描述

为什么需要交叉验证

交叉验证⽬的:为了让被评估的模型更加准确可信

5.⽹格搜索

通常情况下,有很多参数是需要⼿动指定的(如k-近邻算法中的K值),这种叫超参数。但是⼿动过程繁杂,所以需要 对模型预设⼏种超参数组合。每组超参数都采⽤交叉验证来进⾏评估。最后选出最优参数组合建⽴模型。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值