08-更多关于k近邻算法的思考

k近邻算法的优点

  在前面几篇博客中已经系统的学习了k近邻算法。在这篇博客中主要对之前学习的 k 近邻算法进行一个总结。

  k近邻算法是解决分类问题的算法,不仅如此,它天然地可以解决多分类问题。之前在谈到机器学习可以解决的问题中,对于分类这个问题,有一些算法是只能解决二分类问题的,而有一些算法是可以天然地解决多分类问题的。那么k近邻算法就是天然地可以解决多分类问题这样的一种算法。而且k近邻算法思想简单,但是效果十分强大

  不仅如此,我们使用 k近邻算法还可以解决回归问题。回想一下,什么是回归问题?就是我们要预测的是一个数值。比如说,我们要预测一个房子的房价是多少?要预测一个学生的考试分数是多少?或者要预测下一个时刻的股票价值是多少?这些都属于回归问题。那我们怎样使用k近邻算法解决回归问题呢?

  普通的方式就是找到离我们要预测的节点最近的k个节点。由于是监督学习,相应的都有的它的真值。那么就可以预测这个绿色的节点大概的值应该是最近的这三个点的平均值。
在这里插入图片描述
  当然,也可以思考一下,根据之前所学习的使用k近邻算法,我们也可以相应的考虑上离它最近的这些节点之间的距离,它们可以代表权值,距离越近,权值越高。所以我们也可以改进它使用加权平均的方法来进行预测。但是不管怎么样,我们都可以使用k近邻算法来解决回归问题的。

  事实上,sklearn 为我们封装了 KNeighborsRegressor 这样一个类,它就是使用k近邻算法来解决回归问题。由于我还没有学习回归问题,这里就先不介绍了。我们可以在学习了回归问题之后,再回过头来使用 k近邻算法解决回归问题相应的类应该怎样使用。


k近邻算法的缺点

  综上所述,k近邻算法看起来已经非常强大了,但是它还是存在很多缺点。k近邻算法最大的缺点就在于它的效率十分低下。如果我们的训练集有 m 个样本,n 个特征,则预测每一个新的数据,需要 O(m*n) 级别的时间复杂度。但是,对于k近邻算法,有很多优化的方式,比如使用树结构:KD-Tree(k-维树的缩写),Ball-Tree。即使如此,k近邻算法依然是一个效率低下的算法。

  除此之外,k近邻算法还有其他的问题。k近邻算法最后得到的结果是高度数据相关的,当然,对于我们的机器学习算法来说,我们就是使用提供给机器学习算法的数据来进行预测,所以理论上所有的机器学习算法都是高度数据相关的。不过,k近邻算法相较而言,对 outlier(异常值) 更加的敏感,比如说,我们使用3近邻算法,但是在我们要预测的样本周边一旦有两个错误的值的话,就足以让我们最终的预测结果变得错误,哪怕即使在这个空间中是有大量的正确的样本,这就是k近邻算法的一个问题。

  k近邻算法的另外一个问题就是预测结果不具有可解释性。换句话说,我们只是找到了和我们要预测的这个样本比较近的距离的这些样本,我们就说我们要预测的样本属于这个类别。但是我们要预测的样本为什么属于这个类别?我们根本无从知晓。那么在很多研究上,我们只是拿到这个预测结果是远远不够的,我们希望对预测结果有一定的解释性,进而我们能通过这些解释推广或者是去制作新的工具,或者是以此为基础发现新的理论也好来改善我们生产环境中其它的方面,那么这些是 k近邻算法做不到的。

  k近邻算法一个更大缺点就是维数灾难。所谓的维数灾难,就是随着维度的增加,“看似相近” 的两个点之间的距离越来越大。而由于k近邻算法非常依赖于两个点之间距离的计算。这使得一旦我们使用k近邻算法处理高维数据的时候就很有可能遭受维数的灾难。下面举个栗子。

在这里插入图片描述

  从上面的表格中,我们发现到了 10000 维时,0和1之间的距离就已经变成100了。实际上,在使用机器学习算法来处理数据的时候,如果在真正的生产环境中,在很多领域,处理成千上万维的数据都是很正常的。当然维数灾难有一个解决方法就是降维,在后面我们将会学习到一个最常见的降维方式 PCA。


回顾机器学习

  最后,我们再来回顾一下机器学习的流程。

  我们从一个完整的原始的数据集出发,(1) 我们首先需要将原始数据集分为训练数据集和测试数据集。然后,对于kNN这种算法,我们需要数据在同一个尺度下,因此我们需要将数据进行归一化处理。(2) 所以我们的训练数据集首先通过一个 Scaler 进行数据的归一化,(3) 将归一化的数据进行训练,得到一个模型。之后,(4) 对于我们的测试数据集,同样也需要使用同样的 Scaler 进行归一化,(5) 然后送入到模型中来看它的分类准确度(accuracy)。
在这里插入图片描述
  我们在训练这个模型的过程中,已经固定好了一组超参数,为了获得最好的模型,我们学习了使用网格搜索的方式来寻找最好的超参数,进而得到一个最好的模型来完成所要解决的任务。

在这里插入图片描述


对于 kNN 算法的总结就到此为止,后面我将会继续学习怎么处理回归问题~~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值