[机器学习] k近邻算法 (kNN)

kNN算法基本思路

kNN算法通过计算当前测试样本与离它最近的k个点的距离,进行投票,得到它最有可能的分类结果。

特点

首先来看看机器学习算法的基本流程:
machinelearning
由此可见kNN算法的特点:
1. k近邻算法是非常特殊的,可以认为是没有模型的算法。
2. 为了和其他算法统一,可以认为训练数据集就是模型本身。

这也是scikit-learn在封装的时候的思路,来和其他算法统一。由此,每一个算法,都会有fit这个过程。

kNN算法核心

由于kNN算法可以认为数据集就是模型本身,所以fit的过程实际上就是把数据集作为模型的过程,因此这个算法的核心在于predict。
计算距离:
distance
选k个neighbors并投票:
vote
简洁过程:
brief

用scikit-learn进行机器学习步骤

1. 加载scikit-learn中机器学习对应的算法
2. 创建这个算法对应的实例,并传入所需参数
3. fit过程,拟合数据集
4. predict进行预测
如果需要自己写一个机器学习算法,只要遵循scikit-learn的流程和接口返回要求,就可以无缝地送给scikit-learn其他方法。

使用scikit-learn中的kNN

kNN-Jupter

超参数

机器学习参数主要分为:超参数和模型参数。
超参数:在算法运行前需要决定的参数
模型参数:算法过程中学习的参数
在kNN算法中:
1. 没有模型参数
2. 其中的k是典型的超参数

寻找最好的k

这里用scikit-learn内置的手写体数字的数据。

导入数据,分为train set和test set, 用kNN算法进行分类并得出正确率

data

寻找最好的k

k
这里需要注意的是,如果找到的最好的超参数是边界上的值,就意味着有可能有更好的k值在这个范围的外面,比如best_k是10的话,那么有可能要在8到20这个范围再搜索一下,看有没有更好的超参数。

考虑距离?不考虑距离?

上面我们只考虑了k这一个超参数,且只是找到最近的k个点,并没有把它们的距离纳入考虑。如下图所示,如果是普通的kNN算法,那么投票蓝色 : 红色=2 : 1, 蓝色胜出,但如果考虑了距离,则红色胜出。
dis
考虑距离的一个优点就是,当分为多类如三类的情况,如下,可能会出现平票的现象,那么此时,考虑距离,就能把样本归为离它最近的那一类了。
t相应的超参数等可以查看scikit-learn kNN的文档
这里写图片描述

搜索明可夫斯基距离相应的p (Minkowski Distance)

更多关于距离的定义

欧拉距离:欧 曼哈顿距离:这里写图片描述

示意图:这里写图片描述 其中绿色的代表欧拉距离,其他的代表曼哈顿距离

换个写法,可以发现一个规律:这里写图片描述
其中第三个式子,就是明可夫斯基距离。其中的p就是一种超参数。p=1时,就是曼哈顿距离;p=2时,明可夫斯基距离就是欧拉距离。
m
面对很多其他的超参数,我们都可以通过这种搜索的策略,来找到最好的超参数值。这种搜索策略就叫做“网格搜索”。

实际上很多超参数都有着相互依赖的关系,有时候实现会有点复杂。如我们不考虑距离的时候,也不会牵扯到p这个超参数。那我们怎么才能一次性的得到最好的超参数的组合呢?事实上scikit-learn为我们的网格搜索方式封装了一个专门的函数,只要学习使用这个网格搜索的方法就能更好更方便地找到最好的超参数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值