📜  Scikit学习-K最近邻居(KNN)

📅  最后修改于: 2020-12-10 05:53:12             🧑  作者: Mango


本章将帮助您了解Sklearn中最接近的邻居方法。

基于邻居的学习方法有两种类型,即有监督的无监督的。有监督的基于邻居的学习既可以用于分类预测问题,也可以用于回归预测问题,但是它主要用于行业中的分类预测问题。

基于邻居的学习方法没有专门的训练阶段,而是在分类时将所有数据用于训练。它还不假定有关基础数据的任何信息。这就是它们本质上是惰性和非参数化的原因。

最近邻方法的主要原理是-

  • 查找距离新数据点最近的壁橱中预定数量的训练样本

  • 从这些训练样本数量中预测标签。

在这里,样本数可以是用户定义的常数,例如在K近邻学习中,也可以根据点的局部密度而变化,例如在基于半径的邻居学习中。

sklearn.neighbors模块

Scikit-learn具有sklearn.neighbors模块,该模块为无监督和受监督的基于邻居的学习方法提供功能。作为输入,此模块中的类可以处理NumPy数组或scipy.sparse矩阵。

算法类型

可以在基于邻居的方法的实现中使用的不同类型的算法如下-

蛮力

数据集中所有点对之间距离的强力计算提供了最幼稚的邻居搜索实现。从数学上来说,对于D个维度上的N个样本,蛮力方法的缩放比例为0 [DN 2 ]

对于小数据样本,此算法可能非常有用,但是随着样本数量的增加,它变得不可行。可以通过编写关键字algorithm =’brute’来启用蛮力邻居搜索。

KD树

为了解决暴力破解方法的计算效率低下而发明的基于树的数据结构之一就是KD树数据结构。基本上,KD树是一种二叉树结构,称为K维树。它通过将参数空间划分为嵌套的正交区域(将数据点填充到其中)来沿数据轴递归划分参数空间。

好处

以下是KD树算法的一些优点-

构造速度快-由于仅沿数据轴执行分区,因此KD树的构造速度非常快。

更少的距离计算-该算法只需很少的距离计算即可确定查询点的最近邻居。它只需要𝑶[𝐥𝐨𝐠(𝑵)]距离的计算。

缺点

仅对低维邻居搜索快速-对低维(D <20)邻居搜索非常快,但是随着D的增长,它变得无效。由于仅沿数据轴执行分区,

可以通过编写关键字algorithm =’kd_tree’来启用KD树邻居搜索。

球树

众所周知,KD树在高维方面效率低下,因此,为了解决KD树的这种低效率问题,开发了球树数据结构。在数学上,它将数据递归地划分为质心C和半径r定义的节点,以使节点中的每个点都位于质心C和半径r定义的超球面内。它使用下面给出的三角形不等式,从而减少了邻居搜索的候选点数

$$ \ arrowvert X + Y \ arrowvert \ leq \ arrowvert X \ arrowvert + \ arrowvert Y \ arrowvert $$

好处

以下是Ball Tree算法的一些优点-

高效处理高度结构化的数据-由于球形树将数据划分为一系列嵌套的超球体,因此对高效处理高度结构化的数据非常有效。

表现优于KD树-球树在高维方面表现优于KD树,因为它具有球树节点的球形几何形状。

缺点

成本高昂-将数据划分为一系列嵌套的超球体,使其构造非常昂贵。

可以通过编写关键字algorithm =’ball_tree’来启用球树邻居搜索。

选择最近邻居算法

给定数据集的最佳算法的选择取决于以下因素-

样本数(N)和维数(D)

这些是选择最近邻居算法时要考虑的最重要因素。这是由于以下原因-

  • 蛮力算法的查询时间随着O [DN]的增长而增加。

  • 球树算法的查询时间随着O [D log(N)]而增长。

  • KD树算法的查询时间随D的变化而变化,这很难描述。当D <20时,成本为O [D log(N)],该算法非常有效。另一方面,在D> 20的情况下效率低下,因为成本增加到接近O [DN]。

数据结构

影响这些算法性能的另一个因素是数据的固有维数或数据的稀疏性。这是因为球树和KD树算法的查询时间会受到很大的影响。而蛮力算法的查询时间在数据结构上是不变的。通常,当植入具有较小固有维数的稀疏数据时,球树和KD树算法会产生更快的查询时间。

邻居数(k)

请求一个查询点的邻居数(k)影响Ball树算法和KD树算法的查询时间。随着邻居数(k)的增加,查询时间变慢。而蛮力的查询时间将不受k值的影响。

查询点数

因为它们需要构造阶段,所以如果存在大量查询点,则KD树算法和Ball树算法都将有效。另一方面,如果查询点数量较少,则蛮力算法的性能要优于KD树和Ball树算法。