sklearn的knn模型学习

参考:
Scikit Learn - KNN Learning
1.6最近邻算法
https://scikit-learn.org/stable/user_guide.html
机器学习中的几种常用距离度量方法

k-NN 最近邻算法

特点

非参数化:没有数据分布的假设,模型架构由数据集决定
惰性/基于实例机制:不会去构造一个泛化的内部模型,而是简单地存储训练数据的实例。

计算步骤

1.计算并存储训练集中每个样本的 k 个最近邻域。
2.对于未标记的样本,它会从数据集中检索 k 个最近的相邻要素。然后在这些k-最近的邻居中,它通过投票来预测类(具有多数票的类获胜)。sklearn.neighbors模块实现了最近邻算法,提供了监督和非监督近邻的学习方法。
无监督的最近邻居实现了不同的算法(BallTree、KDTree 或 Brute Force),查找每个样本的最近邻。无监督基本上只用了步骤1,以及许多需要近邻搜索的算法(KNN和K-means是著名的算法)的基础。另一方面,基于监督邻居的学习方法用于分类和回归。

注意:关于最近邻算法,如果邻居 k+1 和邻居 k 具有相同的距离,但具有不同的标签, 结果将取决于训练数据的顺序。

输入

sklearn.neighbors 可以处理 Numpy 数组或 scipy.sparse 矩阵作为其输入。

参数

1.n_neighbors − int,可选
要获取的邻居数。默认值为5。

2.radius − float,可选
它限制了邻居返回的距离。默认值为1.0。

3.algorithm − {‘auto’,‘ball_tree’,‘kd_tree’,'brute},可选
此参数将采用您要用于计算最近邻的算法(BallTree、KDTree或Brute force)。如果您将提供“auto”,它将尝试根据传递给fit方法的值来决定最合适的算法。

4.leaf_size− int,可选
它会影响构造和查询的速度以及存储树所需的内存。它被传递给BallTree或KDTree。虽然最佳值取决于问题的性质,但其默认值为30。

5.metric − string 或者callable
它是用于计算点之间距离的度量。我们可以将其作为字符串或可调用函数传递。在可调用函数的情况下,对每对行调用度量,并记录结果值。它不如将度量名称作为字符串传递有效。
我们可以从scikit learn或scipy.spatial.distance中选择公制。有效值如下所示−
Scikit-learn − [‘余弦’、‘曼哈顿’、‘欧几里德’、‘l1’、‘l2’、‘城市街区’]
scipy.spatial.distance−
[‘braycurtis’、‘canberra’、‘chebyshev’、‘dice’、‘hamming’、‘jaccard’、‘correlation’、‘kulsinski’、‘mahalanobis’、‘minkowski’、‘rogerstanimoto’、‘russellrao’、‘Sokalmichem’、‘sokalsneath’、‘seuclidean’、‘Sqlidean’、‘yule’]。默认指标为“Minkowski”。

6.P−integer,可选
它是Minkowski度量的参数。默认值为2,相当于使用欧几里得距离(l2)。

7.metric_params − dict,可选

这是度量函数的附加关键字参数。默认值为“无”。

8.N_jobs − int或None,可选

它表示为邻居搜索运行的并行作业数。默认值为“无”。

实例

找到最近邻

参考1.6.1.1. 找到最近邻

分类

scikit-learn 实现了两种不同的最近邻分类器:
1.基于每个查询点的 k 个最近邻实现,其中 k 是用户指定的整数值。
k-邻居分类是KNeighborsClassifier的技术中比较常用的一种。 值的最佳选择是高度依赖数据的:通常较大的 k 是会抑制噪声的影响,但是使得分类界限不明显。

2.RadiusNeighborsClassifier 基于每个查询点的固定半径 r 内的邻居数量实现, 其中 r 是用户指定的浮点数值。
如果数据是不均匀采样的,那么 RadiusNeighborsClassifier 中的基于半径的近邻分类可能是更好的选择。用户指定一个固定半径 ,使得稀疏邻居中的点使用较少的最近邻来分类。

权重:
基本的最近邻分类使用统一的权重:分配给查询点的值是从最近邻的简单多数投票中计算出来的。 在某些环境下,最好对邻居进行加权,使得更近邻更有利于拟合。可以通过 weights 关键字来实现。默认值 weights = ‘uniform’ 为每个近邻分配统一的权重。而 weights = ‘distance’ 分配权重与查询点的距离成反比。 或者,用户可以自定义一个距离函数用来计算权重。

回归

最近邻回归是用在数据标签为连续变量,而不是离散变量的情况下。分配给查询点的标签是由它的最近邻标签的均值计算而来的。

scikit-learn 实现了两种不同的最近邻回归:KNeighborsRegressor 基于每个查询点的 k 个最近邻实现, 其中 k 是用户指定的整数值。RadiusNeighborsRegressor 基于每个查询点的固定半径 r 内的邻点数量实现, 其中 r 是用户指定的浮点数值。

基本的最近邻回归使用统一的权重:即,本地邻域内的每个邻点对查询点的分类贡献一致。 在某些环境下,对邻点加权可能是有利的,使得附近点对于回归所作出的贡献多于远处点。 这可以通过 weights 关键字来实现。默认值 weights = ‘uniform’ 为所有点分配同等权重。 而 weights = ‘distance’ 分配的权重与查询点距离呈反比。 或者,用户可以自定义一个距离函数用来计算权重。

算法

暴力计算

最简单的近邻搜索的实现涉及数据集中所有成对点之间距离的暴力计算: 对于 D 维度中的 N 个样本来说, 这个方法的复杂度是 O[D N^2]。 对于小数据样本,高效的暴力近邻搜索是非常有竞争力的。 然而,随着样本数 N 的增长,暴力方法很快变得不切实际了。在 sklearn.neighbors 类中, 暴力近邻搜索通过关键字 algorithm = ‘brute’ 来指定,并通过 sklearn.metrics.pairwise 中的例程来进行计算。

暴力计算进阶

为了解决效率低下的暴力计算方法,已经发明了大量的基于树的数据结构。总的来说, 这些结构试图通过有效地编码样本的 aggregate distance (聚合距离) 信息来减少所需的距离计算量。 基本思想是,若 A 点距离 B 点非常远,B 点距离 C 点非常近, 可知 A 点与 C 点很遥远,不需要明确计算它们的距离。 通过这样的方式,近邻搜索的计算成本可以降低为 O[D N \log(N)] 或更低。 这是对于暴力搜索在大样本数 N 中表现的显著改善。

KD-树

利用这种聚合信息的早期方法是 KD tree 数据结构(* K-dimensional tree* 的简写), 它将二维 Quad-trees 和三维 Oct-trees 推广到任意数量的维度. KD 树是一个二叉树结构,它沿着数据轴递归地划分参数空间,将其划分为嵌入数据点的嵌套的各向异性区域。 KD 树的构造非常快:因为只需沿数据轴执行分区, 无需计算 D-dimensional 距离。 一旦构建完成, 查询点的最近邻距离计算复杂度仅为 O[\log(N)] 。 虽然 KD 树的方法对于低维度 (D < 20) 近邻搜索非常快, 当 D 增长到很大时, 效率变低: 这就是所谓的 “维度灾难” 的一种体现。 在 scikit-learn 中, KD 树近邻搜索可以使用关键字 algorithm = ‘kd_tree’ 来指定, 并且使用类 KDTree 来计算。

Ball树

为了解决 KD 树在高维上效率低下的问题, ball 树 数据结构就被研发出来了. 其中 KD 树沿笛卡尔轴(即坐标轴)分割数据, ball 树在沿着一系列的 hyper-spheres 来分割数据. 通过这种方法构建的树要比 KD 树消耗更多的时间, 但是这种数据结构对于高结构化的数据是非常有效的, 即使在高维度上也是一样.

ball 树将数据递归地划分为由质心 C 和半径 R 定义的节点,使得节点中的每个点位于由 r 和 C 定义的 hyper-sphere 内. 通过使用 triangle inequality(三角不等式) 减少近邻搜索的候选点数:

|x+y| \leq |x| + |y|

通过这种设置, 测试点和质心之间的单一距离计算足以确定距节点内所有点的距离的下限和上限. 由于 ball 树节点的球形几何, 它在高维度上的性能超出 KD-tree, 尽管实际的性能高度依赖于训练数据的结构. 在 scikit-learn 中, 基于 ball 树的近邻搜索可以使用关键字 algorithm = ‘ball_tree’ 来指定, 并且使用类 sklearn.neighbors.BallTree 来计算. 或者, 用户可以直接使用 BallTree 类.

算法选择

参考:最近邻算法的选择

  • 样本数量 N (i.e. n_samples) 和维度 D (例如. nfeatures).
  • 数据结构
  • query point(查询点)所需的近邻数 k
  • query points(查询点)数

最近质心分类

该 NearestCentroid 分类器是一个简单的算法, 通过其成员的质心来表示每个类。
参考:最近质心分类

邻域成分分析

邻域成分分析(NCA, NeighborhoodComponentsAnalysis)是一种距离度量学习算法,其目的是提高最近邻分类相对于标准欧氏距离的准确性。该算法直接最大化训练集上k近邻(KNN)得分的随机变量,还可以拟合数据的低维线性投影,用于数据可视化和快速分类。

参考:邻域成分分析

分类:
与最近邻分类器(KNeighborsClassifier)相结合,NCA是一种有效的分类算法,因为它可以自然地处理多类问题,而不需要增加模型的大小,并且不引入需要用户进行微调的额外参数。

降维:
NCA可用于进行监督降维。输入数据被投影到一个由最小化NCA目标的方向组成的线性子空间上。可以使用参数n_components设置所需的维数。例如,下图显示了主成分分析的降维(sklearn.decomposition.PCA),线性判别分析(sklearn.discriminant_analysis.LinearDiscriminantAnalysis)和邻域成分分析(NeighborhoodComponentsAnalysis)。在一个64个特征,1797个样本的数字数据集的降维结果。数据集被划分为大小相同的训练集和测试集,然后进行标准化。为了评价该方法的分类精度,对每种方法找到的二维投影点进行了3-最近邻分类精度的计算。每个数据样本属于10个类中的一个。
sklearn的knn模型学习_第1张图片
sklearn的knn模型学习_第2张图片
sklearn的knn模型学习_第3张图片

你可能感兴趣的:(机器学习,机器学习,回归,分类)