机器学习 第4篇:sklearn 最邻近算法概述

sklearn.neighbors 提供了针对无监督和受监督的基于邻居的学习方法的功能。监督的基于最邻近的机器学习算法是值:对带标签的数据的分类和对连续数据的预测(回归)。 无监督的最近算法是许多其他学习方法的基础,尤其是流形学习(manifold learning)和频谱聚类(spectral clustering)。

最近邻方法的原理是找到距离新数据点最近的特定数量的训练样本,并从中预测标签。样本数可以是用户定义的常数(knn算法),也可以基于点的局部密度而变化(基于半径的邻居学习)。 距离通常可以是任何度量标准:标准欧几里德距离是最常见的选择,基于邻居的方法被称为非通用机器学习方法,因为它们仅“记住”其所有训练数据(可能转换为快速索引结构,例如Ball Tree或KD Tree)。

尽管最邻近算法十分简单,但它已成功解决了许多分类和回归问题,包括手写数字和卫星图像场景。作为非参数方法,它通常非常适用于在决策边界非常不规则的分类情况下。

一,无监督的最邻近算法

无监督的最邻近算法,用于寻找最邻近的数据点,是其他最邻近算法的基础。

无监督的最邻近算法主要有:BallTree,KDTree和基于sklearn.metrics.pairwise中的例程的brute-force算法,用户可以通过关键字'algorithm'来制定寻找最邻近的算法,该关键字的值必须是['auto','ball_tree','kd_tree','brute']之一,当传递默认值“ auto”时,算法会尝试从训练数据中确定最佳的方法。 

brute-force 是最原始的计算两个数据点之间的距离的算法,该算法的思想是计算数据集中每两个数据点之间的距离,找出距离最小的数据点。

K-D Tree:K维度树(k-dimensional tree),基于树来查找距离最小的数据点

Ball Tree:球树,KD 树对于低维度 (D<20) 的近邻搜索非常快, 当 D 增长到很大时, 效率变低;这就是所谓的 “维度灾难” 的一种体现;KD 树只能处理欧式距离;为了解决 KD 树在高维上效率低下的问题, ball 树应运而生,同时 Ball tree 可处理一般的距离。

举个例子,通过 NearestNeighbors()函数和algorithm来指定寻找最邻近数据点的算法:

>>> 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)

二,基于最邻近算法的分类

基于最邻近算法的分类是基于实例的学习,它不尝试构建通用的内部模型,而只是存储训练数据的实例。分类的原理是根据数据点的最邻近数据的类型的多数来预测该数据点的类型,类似于投票,如果一个数据点附近的数据点的类型大部分都是“A”,那么模型预测该数据点的类型也是“A”。

scikit-learn实现两个不同的最近邻居分类器:

  • KNeighborsClassifier 基于每个查询点的k个最近邻居来实现预测,其中,k是指定的整数值。
  • RadiusNeighborsClassifier基于每个训练点的固定半径内的邻居数来实现学习,其中,r是指定的浮点值。

分类器的定义如下,该定义只列出最重要的参数,详细参数请参考sicikit-learn 官网:

sklearn.neighbors.RadiusNeighborsClassifier(radius=1.0, weights='uniform', algorithm='auto', metric='minkowski',...)
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights='uniform', algorithm='auto', metric='minkowski',...)

参数注释:

  • radius:寻找最邻近数据点的半径
  • n_neighbors:最邻近的邻居数量
  • algorithm:寻找最邻近的数据点的算法,有效值是['auto','ball_tree','kd_tree','brute']
  • metric:计算距离的度量,详细信息请查看:DistanceMetric 
  • weights:权重,默认值weights ='uniform',为每个邻居分配统一的权重。 weights ='distance'分配的权重与距查询点的距离成反比。用于也可以提供定义函数来计算权重。在某些情况下,最好对邻居加权,以使较近的邻居对拟合的贡献更大,这可以通过weights关键字完成。

三,基于最邻近算法的回归

基于最邻近算法的分类,本质上是对离散的数据标签进行预测,实际上,最邻近算法也可以用于对连续的数据标签进行预测,这种方法叫做基于最邻近数据的回归,预测的值(即数据的标签)是连续值,通过计算数据点最临近数据点平均值而获得预测值。

scikit-learn实现了两个不同的最邻近回归模型:

  • KNeighborsRegressor:根据每个查询点的最邻近的k个数据点的均值作为预测值,其中,k是用户指定的整数。
  • RadiusNeighborsRegressor:基于查询点的固定半径内的数据点的均值作为预测值,其中r是用户指定的浮点值。

回归模拟器的定义如下,该定义只列出最重要的参数,详细参数请参考sicikit-learn 官网:

sklearn.neighbors.KNeighborsRegressor(n_neighbors=5, weights='uniform', algorithm='auto', metric='minkowski',...)
sklearn.neighbors.RadiusNeighborsRegressor(radius=1.0, weights='uniform', algorithm='auto', metric='minkowski',...)

最基本的最邻近回归使用统一的权重,也就是说,在特定范围中的每个数据点对查询点的分类(回归)的作用是相同的。在某些情况下,对权重点进行加权可能会比较有利,以使邻近的点比远离的点对回归的贡献更大,这可以通过weights关键字完成。默认值weights ='uniform',为所有点分配相等的权重。 weights ='distance'分配的权重与距查询点的距离成反比。

 

参考文档:

1.6. Nearest Neighbors

K-D Tree

作者悦光阴
本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。
posted @ 2020-11-03 08:31  悦光阴  阅读(668)  评论(0编辑  收藏  举报