机器学习 第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'分配的权重与距查询点的距离成反比。
参考文档:
K-D Tree
机器学习 第4篇:sklearn 最邻近算法概述的更多相关文章
- 机器学习算法及代码实现–K邻近算法
机器学习算法及代码实现–K邻近算法 1.K邻近算法 将标注好类别的训练样本映射到X(选取的特征数)维的坐标系之中,同样将测试样本映射到X维的坐标系之中,选取距离该测试样本欧氏距离(两点间距离公式)最近 ...
- [机器学习] ——KNN K-最邻近算法
KNN分类算法,是理论上比较成熟的方法,也是最简单的机器学习算法之一. 该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别 ...
- 《机器学习实战》学习笔记一K邻近算法
一. K邻近算法思想:存在一个样本数据集合,称为训练样本集,并且每个数据都存在标签,即我们知道样本集中每一数据(这里的数据是一组数据,可以是n维向量)与所属分类的对应关系.输入没有标签的新数据后,将 ...
- <机器学习实战>读书笔记--k邻近算法KNN
k邻近算法的伪代码: 对未知类别属性的数据集中的每个点一次执行以下操作: (1)计算已知类别数据集中的点与当前点之间的距离: (2)按照距离递增次序排列 (3)选取与当前点距离最小的k个点 (4)确定 ...
- [机器学习实战] k邻近算法
1. k邻近算法原理: 存在一个样本数据集,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对 ...
- 机器学习基础——简单易懂的K邻近算法,根据邻居“找自己”
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天的文章给大家分享机器学习领域非常简单的模型--KNN,也就是K Nearest Neighbours算法,翻译过来很简单,就是K最近邻居 ...
- 机器学习01-kNN邻近算法
k-近邻算法 概述:k-近邻算法採用測量不同特征值之间的距离方法进行分类 长处:精度高.对于异常值不敏感.无数据输入假定 缺点:计算复杂度高,空间复杂度高,而且它没有办法各处基础数据的一些内部信息数据 ...
- 机器学习&深度学习基础(tensorflow版本实现的算法概述0)
tensorflow集成和实现了各种机器学习基础的算法,可以直接调用. 代码集:https://github.com/ageron/handson-ml 监督学习 1)决策树(Decision Tre ...
- 机器学习&深度学习基础(机器学习基础的算法概述及代码)
参考:机器学习&深度学习算法及代码实现 Python3机器学习 传统机器学习算法 决策树.K邻近算法.支持向量机.朴素贝叶斯.神经网络.Logistic回归算法,聚类等. 一.机器学习算法及代 ...
随机推荐
- 报表工具FastReport VCL 最新版发布!
新功能 为主要包类添加了类引用 在报表设计器中添加了SQL编辑器的自定义 为TfrxReport的操作添加了延迟的命令池:PrepareReport,ShowReport,LoadFrom.可以调用R ...
- 再玩树莓派(二)Jexus&.NetCore
接上一篇,操作系统弄好之后,轮到开发运行环境的搭建. 先说说目标,也就是我到底想搞什么飞机.先说说小目标吧. 现有一个手机App客户端,以答题小游戏作为其内容(例如:口算题,24点,科学百科等) 树莓 ...
- MarkDown系列教程
编辑了一个Markdown的系列教程,前一部分是摘编自 菜鸟教程 网站 目录 第一篇 Markdown 使用教程 入门
- 2020.09.05【NOIP提高组&普及组】模拟赛C组1总结
T1:机器翻译 这一道题是一个很简单的队列题目,我们只要每次维护队列元素数量保持在m以内即可 T2:乌龟棋 这一道题我一开始比赛是暴力枚举(万事先暴力),很明显这个肯定会超时(30分)那么考虑动态规划 ...
- VS2015如何调试自己写的DLL与调试
转载: 1. https://blog.csdn.net/u014738665/article/details/79779632 2. https://blog.csdn.net/jacke121/a ...
- 计数,dic的创建方式,求九九乘法表
s1='char,python,nihao,ni,ni,python's=s1.split(',')print(s1)s2=list()for i in s: if i not in s2: s2.a ...
- 执行新增和修改操作报错connection is read-only. Queries leading to data modification are not allowed
出现这个问题的原因是默认事务只有只读权限,因此要添加下面的每一个add*,del*,update*等等. 分别给予访问数据库的权限. 方法名的前缀有该关键字设置了read-only=true,将其改为 ...
- spring redis 配置
- shell-的变量-局部变量
1. 定义本地变量 本地变量在用户当前的shell生产期的脚本中使用.例如,本地变量OLDBOY取值为ett098,这个值只在用户当前shell生存期中有意义.如果在shell中启动另一个进程或退出, ...
- Java死锁编码及定位分析的demo
死锁 死锁是什么 大学课程中的四个要素: (1)互斥(2)不可抢占(3)循环等待(4)请求保持 也就是下图所描述 产生死锁的主要原因 (1)系统资源不足(2)进程运行推进的顺序不合适(3)资源分配不当 ...