【sklearn第十二讲】最近邻

本文介绍了机器学习中的最近邻算法,包括无监督近邻、KDTree与BallTree类,以及最近邻分类和回归。讲解了不同类型的近邻算法如Brute Force、KD Tree和Ball Tree,并探讨了算法选择的考虑因素,如样本数、维数和数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

机器学习训练营——机器学习爱好者的自由交流空间(入群联系qq:2279055353)

sklearn.neighbors提供了一组基于邻居的有监督和无监督学习方法。其中的无监督近邻是其它学习方法的基础,有监督近邻广泛应用于离散标签的分类和连续标签的回归。最近邻方法的基本原则是,找到事先定义样本数,距离新点最近的样本,从这些样本预测新点的标签。样本数可以是用户自定义的(k-nearest neighbor), 或者根据局部的点密度改变(radius-based neighbor). 通常,距离可以是任何测度,标准的欧氏距离是普遍的选择。尽管简单,最近邻已经被成功地应用到分类和回归问题,包括手写数字和卫星遥感图像识别。作为一种非参数方法,它经常能够成功地应用到决策边界不规则的分类里。

类sklearn.neighbors能接受Numpy数组或scipy.sparse矩阵作为输入。对于稠密矩阵,它支持很多距离测度;对于稀疏矩阵,它支持任何Minkowski距离。

无监督近邻

NearestNeighbors执行无监督的近邻学习。它作为三种不同的近邻算法:BallTree, KDTree, 和一个基于sklearn.metrics.pairwise的暴风算法的统一接口。近邻搜索算法的选择受关键词algorithm控制,该词可选值在[‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’]里。当取默认值auto时,算法试图从训练数据里确定最好的方法。

找到最近邻

对于在两个数据集之间找到最近邻这样的简单任务,可以使用sklearn.neighbors里的无监督算法。

from sklearn.neighbors import NearestNeighbors
import numpy as np
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
nbrs = NearestNeighbors(n_neighbors=2, algorithm='ball_tree').fit(X)
distances, indices = nbrs.kneighbors(X)
indices
distances

这里写图片描述
这里写图片描述

因为查询集匹配训练集,每一个点的最近邻就是该点自身,距离为0. 也可以产生一个稀疏图,表示邻近点的连接情况。

nbrs.kneighbors_graph(X).toarray()

这里写图片描述

在我们的数据集,下标顺序邻近的点,在参数空间里也是邻近的,这导致了k-近邻的块对角矩阵。

KDTree 与 BallTree 类

也可以使用KDTree, BallTree类直接找到最近邻。 Ball Tree and KD Tree有相同的接口,下面我们举一个KD Tree的例子。

from sklearn.neighbors import KDTree
import numpy as np
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
kdt = KDTree(X, leaf_size=30, metric='euclidean')
kdt.query(X, k=2, return_distance=False)

这里写图片描述

更多的选项信息,请参考KDTree, BallTree类文档。

最近邻分类

基于邻居的分类是一种基于实例的学习,它并不试图创建一个通用模型,而仅仅存储训练数据的实例。分类计算每一个点的近邻的大多数投票结果,即,一个待分类的点被分到它的大多数近邻所属的类。

scikit-learn执行两个不同的近邻分类器。KNeighborsClassifier执行基于每一个待分类点的k近邻的学习,k是一个由用户确定的整数。最优的k值高度依赖数据:通常一个更大的k值抑制噪音的效果,却使分类边界不太清晰。

RadiusNeighborsClassifier执行基于每个训练点的固定半径r内的邻居数的学习,r是一个由用户确定的浮点数。当数据并不是均匀抽样时,这种方法是更好的选择。用户确定一个固定的半径r, 使得在稀疏邻居里的点使用更少的近邻分类。对于高维的参数空间,该方法不太有效。

基本的近邻分类使用一致的权,即,分派给一个查询点的值从它的近邻的大多数投票结果计算得到。在某些情况下,给邻居加权,使得更近的邻居对拟合贡献的更多。这可以通过关键词weights实现。默认weights = ‘uniform’, 即为每一个邻居分派一致的权。weights = ‘distance’, 为邻居分派与查询点的距离成反比例的权,即距离越大权越小。用户也可以自定义权函数。
这里写图片描述

最近邻回归

当数据标签是连续而不是离散的时候,可以使用基于邻居的回归。分派给一个查询点的标签,可以根据它的近邻标签的均值来计算。scikit-learn执行两种不同的邻居回归。KNeighborsRegressor执行基于每个查询点的k近邻的学习,k是由用户确定的整数。RadiusNeighborsRegressor执行基于查询点固定半径r内的邻居的学习,r是由用户确定的浮点值。

基本的近邻回归使用一致的权,即,在局部的邻居里的每一个点对一个查询点的分类贡献相等的权。在某些情况下,对邻居加权,使得邻近的点对回归的贡献多于相对远的点。这可以通过关键词weights实现。默认weights = ‘uniform’, 给所有的邻居分派相等的权。weights = ‘distance’, 为邻居分派与查询点的距离成反比例的权,即距离越大权越小。用户也可以自定义权函数。
这里写图片描述

多结果近邻回归的一个例子是"基于多结果估计量的人脸完成"。在这个例子里,输入X是人脸上半部分像素,输出Y是预测的人脸下半部分像素。
这里写图片描述

近邻算法

Brute Force

近邻的快速计算方法是机器学习领域的一个活跃的研究方向。最直接的邻居搜索执行数据集所有点对的暴风( brute-force)计算。对于 DDD 维空间上的 NNN 个样本,该方法的计算复杂度为 O[DN2]O[DN^2]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值