机器学习训练营——机器学习爱好者的自由交流空间(入群联系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]