【Python学习】 - sklearn学习 - KNN

前言:

针对一个完整的机器学习框架目前还没有总结出来,所以目前只能总结每一个单独的算法。由于现在研究的重点是算法,所以对于数据的处理,数据的分析和可视化呈现,在现阶段并不进行展示(这样容易陷入纠结和浪费过多时间)。但是,当理解算法的基本原理和实现方法之后,再回过头来从头开始,实现一个完整的机器学习流程。**

1. KNN 原理

KNN是一种即可用于分类又可用于回归的机器学习算法。对于给定测试样本,基于距离度量找出训练集中与其最靠近的K个训练样本,然后基于这K个“邻居”的信息来进行预测。
在分类任务中可使用投票法,选择这K个样本中出现最多的类别标记作为预测结果;在回归任务中可使用平均法,将这K个样本的实值输出标记的平均值作为预测结果。当然还可以基于距离远近程度进行加权平均等方法。

2. KNN 优缺点

KNN 优点

理论成熟,思想简单,既可以用来做分类也可以用来做回归
可用于非线性分类
训练时间复杂度比支持向量机之类的算法低,仅为O(n)
和朴素贝叶斯之类的算法比,对数据没有假设,准确度高,对异常点不敏感
由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合
该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分

KNN 缺点

计算量大,尤其是特征数非常多的时候
样本不平衡的时候,对稀有类别的预测准确率低
KD树,球树之类的模型建立需要大量的内存
使用懒散学习方法,基本上不学习,导致预测时速度比起逻辑回归之类的算法慢
相比决策树模型,KNN模型可解释性不强
3. KNN 算法三要素
距离度量

K 值的选择

下面分析k值过大和过小造成的影响:

k值较小,就相当于用较小的领域中的训练实例进行预测,训练误差近似误差小(偏差小),泛化误差会增大(方差大),换句话说,K值较小就意味着整体模型变得复杂,容易发生过拟合;

k值较大,就相当于用较大领域中的训练实例进行预测,泛化误差小(方差小),但缺点是近似误差大(偏差大),换句话说,K值较大就意味着整体模型变得简单,容易发生欠拟合;一个极端是k等于样本数m,则完全没有分类,此时无论输入实例是什么,都只是简单的预测它属于在训练实例中最多的类,模型过于简单。

对于k值的选择,没有一个固定的经验(sklearn默认为5),一般根据样本的分布,选择一个较小的值,可以通过交叉验证选择一个合适的k值。

分类决策规则

KNN 算法一般是用多数表决方法,即由输入实例的K个邻近的多数类决定输入实例的类。这也是经验风险最小化的结果。

我们定义训练误差率是K近邻训练样本标记与输入标记不一致的比例,误差率表示为:

目的是K近邻的标记值尽可能的与输入标记一致,

所以最小化

最大化:

 

4 KNN 算法实现

线性扫描

线性扫描也叫“暴力搜索”,是计算输入实例与每一个训练实例的距离,并选择前k个最近邻的样本来多数表决。这种实现方法简单,但是当训练集或特征维度很大时(我们经常碰到样本的特征数有上千以上,样本量有几十万以上),如果我们这要去预测少量的测试集样本,算法的时间效率很成问题,计算非常耗时,故这种暴力实现原理是不可行的 。

kd 树实现

kd 树是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构,构造kd树相当于不断用垂直于坐标轴的超平面将k维空间进行划分,构成一系列的k维超矩形区域,kd树省去了对大部分数据的搜索,大大的较少了计算量。

注意这里的k和KNN中的k的意思不同。KNN中的k代表最近的k个样本,kd树中的k代表样本特征的维数。

KD树算法包括三步,第一步是建树,第二部是搜索最近邻,最后一步是预测。

kd 树的建立。kd树实质是二叉树,其划分思想与CART树一致,切分使样本复杂度降低最多的特征。kd树分别计算k个特征的方差,认为特征方差越大,则该特征的复杂度亦越大,优先对该特征进行切分 ,切分点是所有实例在该特征的中位数。重复该切分步骤,直到切分后无样本则终止切分,终止时的样本为叶节点,形成kd树。

kd树搜索最近邻。生成kd树以后,对于一个目标点以目标点为圆心,以目标点到叶子节点样本实例的距离为半径,得到一个超球体,最近邻的点一定在这个超球体内部。然后返回叶子节点的父节点,检查另一个子节点包含的超矩形体是否和超球体相交,如果相交就到这个子节点寻找是否有更加近的近邻,有的话就更新最近邻。如果不相交直接返回父节点的父节点,在另一个子树继续搜索最近邻。依次下去,当回溯到根节点时,算法结束,此时保存的最近邻节点就是最终的最近邻。

对于kd树来说,划分后可以大大减少无效的最近邻搜索,很多样本点由于所在的超矩形体和超球体不相交,根本不需要计算距离。大大节省了计算时间。

kd树预测。

分类:每一次搜寻与输入样本最近的样本节点,然后忽略该节点,重复同样步骤K次,找到与输入样本最近邻的K个样本 ,投票法确定输出结果。

回归:用K个最近样本的输出的平均值作为回归预测值。

球树实现

kd树算法虽然提高了KNN搜索的效率,但是在某些时候效率并不高,比如当处理不均匀分布的数据集时,不管是近似方形,还是矩形,甚至正方形,都不是最好的使用形状,因为他们都有角。为了优化超矩形体导致的搜索效率的问题,从而提出了球树实现的方法。其基本思想和kd树类似,就是每个分割块都是超球体,而不是KD树里面的超矩形体。

5 sklearn实现KNN算法


在scikit-learn 中,与近邻法这一大类相关的类库都在sklearn.neighbors包之中。KNN分类树的类是KNeighborsClassifier,KNN回归树的类KNeighborsRegressor。除此之外,还有KNN的扩展,即限定半径最近邻分类树的类RadiusNeighborsClassifier和限定半径最近邻回归树的类RadiusNeighborsRegressor, 以及最近质心分类算法NearestCentroid。

在这些算法中,KNN分类和回归的类参数完全一样。具体参数如下:

sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights=’uniform’, 
algorithm=’auto’, leaf_size=30, p=2, metric=’minkowski’, metric_params=None, 
n_jobs=None, **kwargs)


n_neighbors:KNN中的k值,默认为5(对于k值的选择,前面已经给出解释);

weights:用于标识每个样本的近邻样本的权重,可选择"uniform",“distance” 或自定义权重。默认"uniform",所有最近邻样本权重都一样。如果是"distance",则权重和距离成反比例;如果样本的分布是比较成簇的,即各类样本都在相对分开的簇中时,我们用默认的"uniform"就可以了,如果样本的分布比较乱,规律不好寻找,选择"distance"是一个比较好的选择;

algorithm:限定半径最近邻法使用的算法,可选‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’。
‘brute’对应第一种线性扫描;
‘kd_tree’对应第二种kd树实现;
‘ball_tree’对应第三种的球树实现;
‘auto’则会在上面三种算法中做权衡,选择一个拟合最好的最优算法。

leaf_size:这个值控制了使用kd树或者球树时, 停止建子树的叶子节点数量的阈值。这个值越小,则生成的kc树或者球树就越大,层数越深,建树时间越长,反之,则生成的kd树或者球树会小,层数较浅,建树时间较短。默认是30。

这个值一般依赖于样本的数量,随着样本数量的增加,这个值必须要增加,否则不光建树预测的时间长,还容易过拟合。可以通过交叉验证来选择一个适中的值。当然,如果使用的算法是蛮力实现,则这个参数可以忽略;

metric,p:距离度量(前面介绍过),默认闵可夫斯基距离 “minkowski”(p=1为曼哈顿距离, p=2为欧式距离);

metric_params:距离度量其他附属参数(具体我也不知道,一般用得少);

n_jobs:并行处理任务数,主要用于多核CPU时的并行处理,加快建立KNN树和预测搜索的速度。n_jobs= -1,即所有的CPU核都参与计算。

限定半径最近邻法分类和回归的类的主要参数也和KNN基本一样。具体参数如下:

sklearn.neighbors.RadiusNeighborsClassifier(radius=1.0, weights=’uniform’, 
algorithm=’auto’, leaf_size=30, p=2, metric=’minkowski’, outlier_label=None, 
metric_params=None, n_jobs=None, **kwargs)


radius:限定半径,默认为1。半径的选择与样本分布有关,可以通过交叉验证来选择一个较小的半径,尽量保证每类训练样本其他类别样本的距离较远;
outlier_labe:int类型,主要用于预测时,如果目标点半径内没有任何训练集的样本点时,应该标记的类别,不建议选择默认值 None,因为这样遇到异常点会报错。一般设置为训练集里最多样本的类别。

 

参考链接:https://blog.csdn.net/qq_40195360/article/details/86714337

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重读经典:《End-to-End Object Detection with Transformers》

DETR 论文精读【论文精读】这一次朱毅博士给大家精读的论文是 DETR,是目标检测领域里程碑式的一个工作,文章收录于 ECCV20 。DETR 是 Detection Transformer 的缩写,作者使用 Transformer 简化了目标检测流程,不再需要进行 NMS&am…

Execute SQL Task 参数和变量的映射

Execute SQL Task能够执行带参数的SQL查询语句或存储过程(SP),通过SSIS的变量(Variable)对参数赋值。对于不同的Connection Manager,在Task中需要使用不同的符号(Parameter marker)来…

【Python学习】 - 手写数字识别 - python读入mnist数据集的多种方法

写在前面: 其实网上有很多读入mnist数据的代码,但是都是比较麻烦冗长的函数,本篇文章介绍几种不算很麻烦的,借用库函数读入数据的方法。 方法1: 方法2: 方法3:

Coursera自动驾驶课程第21讲:Dynamic Object Interactions

在第20讲《Coursera自动驾驶课程第20讲:Mission Planning in Driving Environments》 我们学习了任务规划中常用的三种图搜索算法:Breadth First Search、Dijkstra 和 A* 搜索。 在本讲中我们将讨论运动规划器中使用的方法,以处理动态物体和…

sql server 数据库忘记sa账户密码/ 无管理员账户解决办法

一、计算机超级管理员账户有数据库的管理员权限 用管理员账户登录数据库,直接修改sa账户密码即可。 二、数据库中没有管理员权限的账户 SQL Server 2005/2008提供了针对该情况的更好的灾难恢复方法,无需侵入master数据库,不会对master数据库…

机器学习编译第1讲:机器学习编译概述

MLC-机器学习编译-第一讲-机器学习编译概述课程主页:https://mlc.ai/summer22-zh/ 文章目录1.0 概述1.1 什么是机器学习编译1.2 为什么学习机器学习编译1.3 机器学习编译的关键要素1.3.1 备注:抽象和实现1.4 总结1.0 概述 机器学习应用程序已经无处不在…

重读经典:《The Craft of Research(1)》

跟读者建立联系【研究的艺术一】这一次李沐博士给大家精读的是一本关于论文写作的书籍。这本书总共包含四个大的章节,本期视频李沐博士介绍的是第一个章节:Research,Researchers,and Readers。 0. 前言 视频开头,李沐…

机器学习编译第2讲:张量程序抽象

02 张量程序抽象 【MLC-机器学习编译中文版】课程主页:https://mlc.ai/summer22-zh/ 文章目录2.1 元张量函数2.2 张量程序抽象2.2.1 张量程序抽象中的其它结构2.3 张量程序变换实践2.3.1 安装相关的包2.3.2 构造张量程序2.3.3 编译与运行2.3.4 张量程序变换2.3.5 通…

详解自动驾驶仿真数据集 SHIFT:A Synthetic Driving Dataset for Continuous Multi-Task Domain Adaptation

SHIFT:A Synthetic Driving Dataset for Continuous Multi-Task Domain Adaptation本文介绍一个新的自动驾驶仿真数据集:SHIFT,论文收录于 CVPR2022。适应连续变化的环境是自动驾驶系统一直以来要面临的挑战。然而,目前现有的图像…

TFS下的源代码控制

以下主要描述了: TFS源代码控制系统的基本场景如何把一个项目添加到源代码管理中如何与服务器同步如何做Check-In如何做分支与合并什么是上架与下架 我们知道工作项是项目管理的基本元素,但是一个项目的成功,光有工作项还是不够的。工作项说…

地平线:面向规模化量产的智能驾驶系统和软件开发

导读 7月27日,地平线在智东西公开课开设的「地平线自动驾驶技术专场」第3讲顺利完结,地平线智能驾驶应用软件部负责人宋巍围绕 《面向规模化量产的智能驾驶系统和软件开发》这一主题进行了直播讲解。本次分享主要分为以下4个部分: 1、智能驾驶…

重读经典(CLIP上):《Learning Transferable Visual Models From Natural Language Supervision》

CLIP 论文逐段精读【论文精读】这一次朱毅博士给大家精读的论文是 CLIP,来自于 OpenAI,是图像文本多模态领域一个里程碑式的工作。 CLIP 的影响力可见一斑,如果按照沐神之前讲的如何判断一个工作的价值来说,CLIP 应该就是 1001001…

TFS准备(一)

一、TFS概念: TFS全称Team FoundationServer,是应用程序生命周期管理的服务端,功能包括如图功能:源代码管理,版本控制,团队开发协作,统一集成,测试管理等。 二、TFS安装要求&#…

重读经典(CLIP下):《Learning Transferable Visual Models From Natural Language Supervision》

上文链接:重读经典(CLIP上):《Learning Transferable Visual Models From Natural Language Supervision》 5. 实验 现在我们已经知道 CLIP 是如何进行预训练的以及作者为什么选用对比学习来预训练 CLIP,接下来我们就…

TFS创建团队项目(三)

打开Visual Studio 2013,视图-团队资源管理器-连接图标(插头图标) 当前是没有TFS服务器,点击服务器按钮 添加,并在URL地址栏里输入装有TFS的服务器IP地址(配置完TFS后有这个URL:http://tfs-serv…

详解4D毫米波雷达数据集(VOD)Multi-class Road User Detection with 3+1D Radar in the View-of-Delft Dataset

Multi-class Road User Detection with 31D Radar in the View-of-Delft Dataset本文介绍一个新的自动驾驶数据集:VOD,论文收录于 ICRA2022。下一代毫米波雷达除了提供距离、方位和多普勒速度外,还会提供高度信息。 在本文中,作者…

自动驾驶之心:毫米波雷达-视觉融合感知方法(前融合/特征级融合/数据级融合)

毫米波雷达-视觉融合感知方法(前融合/特征级融合/数据级融合)分享一个自动驾驶之心的报告:毫米波雷达与视觉融合目标检测。 作者主页为:https://www.zhihu.com/people/nacayu 文章目录1. 毫米波雷达与相机融合检测背景2. 主流融合…

TFS中的迭代(五)

从团队资源管理器中打开迭代选项。 TFS在新建完团队项目后会自动为本团队项目新建迭代子项,包含发布和冲刺。第一级为团队项目TestProject,第二层为发布,第三层为冲刺,这样的层次一共可以建14层。 这些选项可以编辑,添…

2022百度ApolloDay技术开放日:文心大模型在自动驾驶感知中的落地应用

2数据处理大模型技术是自动驾驶行业近年的热议趋势,但能否落地应用、能否用好是关键难题。百度自动驾驶依托文心大模型特色优势,率先实现技术应用突破。百度自动驾驶技术专家王井东表示:文心大模型-图文弱监督预训练模型,背靠文心…

TFS中的工作项(六)

TFS中的工作项 在VS中打开团队资源管理器 工作项有功能,产品积压工作项,任务,测试用例,Bug,障碍,它们之间的关系是:一个产品或应用,有一系列功能,功能最大,可…