K最近邻算法的原理

K最近邻算法就是目标数据点在现有数据集中,离哪一部分最近就将其划分为哪一部分。
       而K字母的含义就是近邻的个数。在scikit-learn中,K最近邻算法的K值是通过N_neighbors参数来调节的,默认值是5.
       K最近邻算法可以用于回归,原理和其用于分类是相同的。当我们使用K最近邻回归计算某个数据点的预测值时,模型会选择离该数据点最近的若干个数据集中的点,并将它们的y值取平均值,并把改平均值作为新数据点的预测值。

K最近邻算法的用法
  • K最近邻算法在分类任务中的应用

在scikit-learn中,内置了若干个玩具数据集(Toy Datasets),还有一些API让我们可以自己动手生成一些数据集。

       make_blobs生成的数据集一共有两类,其中一类紫色,而另一类黄色,这两类数据集可以看作机器学习的训练数据集,是已知的数据。我们就是基于这些数据用算法进行模型的训练,然后再对新的未知数据进行分类或者回归。
       下面我们看看最近邻算法来拟合这些数据,



       图中粉色区域和灰色区域组成的部分。如果有新的数据输入的话,模型就会自动将新数据分到对应的分类中。例如一个数据点的两个特征分别是6.75和4.82。



       可以看出数据点被划分为浅色一类。
       下面我们看一下分类结果打印:

  • K最近邻算法处理多元分类任务

通过修好make_blobs的centers参数,把数据类型的数量增加到5个,同时修改n_samples参数,把样本数量也增加到500个:


       可以看到新的数据集分类数量变成了5个,而其中有两类数据还有一些重合(图片中心位置的点),这时我们用K最近邻算法建立模型拟合这些数据:


       可以看出,绝大部分数据点放置于正确的分类中,但是有一小部分数据还是进入了错误分类中,这些分类错误的数据点基本都是互相重合的位于图像中心位置的数据点。下面我们看看模型的正确率:


       可以看出K最近邻算法用来分类效果还是不错的。

  • K最近邻算法用于回归分析
           在上次开头的数据集生成器中,可以用make_regression函数来生成数据集进行回归分析:


       可以看到,横轴代表的是样本特征的数值,范围大概在-3 ~ 3;纵轴代表样本的测定值,范围大致在-250 ~ 250。我们使用K最近邻算法来进行回归分析:


       直观来看,模型拟合程度不是很好,有大量的数据点没有被模型覆盖到。下面我们看看模型评分如何:


       可以看出,模型的评分不是很好,我们尝试着减少分类(KNN默认为n_neighbors = 5)试试:


       从上图可以看出,曲线覆盖了更多的点,也就是说,模型变得更加复杂了。接下来我们看看模型得分:


       模型得分有所提高,看起来育德的数据会更加准确。

K最近邻算法项目实践——酒的分类
  • 对数据集进行分析

首先我们把酒的数据集载入项目中并打印,看看数据集中包含了哪些东西。实际上load_wine函数载入的酒数据集,是一种Bunch对象,它包括键(keys)和数值(values):


       从结果当中我们可以看出,酒数据集中包含“data”,目标分类“target”,目标分类名称“target_names”,数据描述“DESCR”,以及特征变量的名称“features_names”
       看看究竟有多少样本(samples),又有多少变量(features),可以用.shape语句来让Python告诉我们数据的大概轮廓:


       可以看出,酒数据集中总共有178个样本,每条数据有13个特征变量。进一步通过打印DESCR键来获得:


       可以看出,酒数据集中的178个样本被归入3个类别中,分别是class_0,class_1和class_2,其中class_0包含59个样本,class_1中包含71个样本,class_2中包含48个样本等信息。

  • 生成训练数据集合测试数据集

我们现在要做的是将数据集分为两个部分:一部分称为训练数据集,另一部分称为测试数据集。
       在scikit-learn中,有一个train_test_split函数,它是用来帮助用户把数据集拆分的工具。其工作原理是:train_test_split函数将数据集进行随机排列,在默认情况下将其中75%的数据及所对应的标签划归到训练数据集,并将其余25%的的数据和所对应标签划归到测试数据集。
        注意:我们一般用大写的X表示数据的特征,而用小写的y表示数据对应的标签。这是因为X是一个二维数组,也称为矩阵;而y是一个一维数组,或者说一个向量。
       接下来将数据集进行拆分并打印结果:


       上述代码中,我们看到了一个参数称为random_state,并且将它指定为0,。这是因为train_test_split函数会生成一个伪随机数,并根据这个伪随机数对数据集进行拆分。而我们有时候需要在一个项目中,让多次生成的伪随机数相同,方法就是通过固定random_state参数的数值,相同的random_state参数会一直生成同样的伪随机数,当这个值我们设置为0,或者保持缺省的时候,则每次生成的伪随机数均不同。
       从结果可以看出,样本X数量和其对应的标签y数量均为133个,约占样本总数的74.7%,而测试数据集中的样本X数量和标签y数量均为45个,约占样本总数的25.3%。同时,不论在训练集中,还是在测试数据集中,特征变量都是13个。

  • 使用K最近邻算法进行建模

K最近邻算法根据训练数据集进行建模,在训练数据集中寻找和新输入的数据最近的数据点,然后把这个数据点的标签分配给新的数据点,以此对新的样本进行分类。
       在上图中,我们给KNeighborsClassifier指定一个参数,n_neighbors=1。正如前面所说的,在scikit-learn中,机器学习模块都是在其固定的类中运行的。而K最近邻分类算法是在neighbors模块中的KNeighborsClassifier类中运行。而我们从一个类中创建对象的时候,就需要指定一个参数。对于KNeighborsClassifier类来说,最关键的参数就是近邻的数量,也就是n_neighbors。而knn则是我们在KNeighborsClassifier类中创建的一个对象。
       接下来我们就要使用这个叫作knn的对象中称为"拟合(fit)"的方法来进行建模,建模的依据就是训练数据集中的样本数据X_train和其对应的标签y_train,代码如下:


       从图中我们可以看到knn拟合方法把自身作为结果返回给了我们。

  • 使用模型对新样本的分类进行预测

现在我们可以使用刚刚建好的模型对新的样本分类进行预测,不过在此之前,可以先用测试数据集对模型进行打分,这就是我们创建测试数据集的目的。测试数据集并不参与建模,但是我们可以用模型对测试数据集进行分类,然后和测试数据集中的样本实际分类进行对比,看吻合度有多高,模型的得分越高,说明模型的预测越准确,满分是1.0。


       假设一新酒测定的特征变量如下:

1) Alcohol 13.2
2) Malic acid 2.77
3) Ash 2.77
4) Alcalinity of ash 2.51
5) Magnesium 18.5
6) Totla phenols 96.6
7) Flavanoids 1.04
8) Nonflavanoid phenols 2.55
9) Proanthocyanins 1.47
10) Color intensity 6.2
11) Hue 1.05
12) OD280/OD315 of diluted wines 3.33
13) Proline 820

根据建好的模型将新酒进行分类:


       模型把新酒分类预测为 class_2,虽然准确率只有76%,但对于第一个机器学习的实战项目来说,还是相当不错的。

深入浅出Python机器学习3——K最近邻算法相关推荐

  1. python机器学习---1. K近邻算法

    机器学习的方法是基于数据产生的"模型" (model) 的算法,也称"学习算法" (learning algorithm).包括有监督学习(supervised ...

  2. python机器学习案例系列教程——K最近邻算法(KNN)、kd树

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 K最近邻简介 K最近邻属于一种估值或分类算法,他的解释很容易. 我们假设一个人的优秀成为设定为1.2.3.4.5.6.7.8.9.10 ...

  3. 《Python机器学习——预测分析核心算法》——2.4 基于因素变量的实数值预测:鲍鱼的年龄...

    本节书摘来异步社区<Python机器学习--预测分析核心算法>一书中的第2章,第2.4节,作者:[美]Michael Bowles(鲍尔斯),更多章节内容可以访问云栖社区"异步社 ...

  4. 机器学习:k邻近算法(KNN)

    title: 机器学习:k邻近算法(KNN) date: 2019-11-16 20:20:41 mathjax: true categories: 机器学习 tags: 机器学习 什么是K邻近算法? ...

  5. 算法基础:k最近邻算法

    本博客所有内容均整理自<算法图解>,欢迎讨论交流~ 了解过机器学习这个概念,一定知道有一种名为k最近邻的算法,简称KNN. 对于k最近邻算法的定义,百度百科是这样给出的:K最近邻(k-Ne ...

  6. python分类预测_《Python机器学习——预测分析核心算法》——2.6 多类别分类问题:它属于哪种玻璃...

    本节书摘来异步社区<Python机器学习--预测分析核心算法>一书中的第2章,第2.6节,作者:[美]Michael Bowles(鲍尔斯),更多章节内容可以访问云栖社区"异步社 ...

  7. KNN算法(K最近邻算法)详解

    K 最近邻的核心数学知识是距离的计算和权重的计算.我们把需要预测的点作为中心点,然后计算其周围一定半径内的已知点距其的距离,挑选前 k 个点,进行投票,这 k 个点中,哪个类别的点多,该预测点就被判定 ...

  8. 回归素材(part10)--深入浅出python机器学习

    学习笔记,仅供参考,有错必纠 文章目录 深入浅出python机器学习 线性回归 基本原理 使用 L 2 L_2 L<

  9. 《Python机器学习——预测分析核心算法》——2.2 分类问题:用声纳发现未爆炸的水雷...

    本节书摘来异步社区<Python机器学习--预测分析核心算法>一书中的第2章,第2.2节,作者:[美]Michael Bowles(鲍尔斯),更多章节内容可以访问云栖社区"异步社 ...

  10. python模型预测_《Python机器学习——预测分析核心算法》——1.5 构建预测模型的流程...

    本节书摘来异步社区<Python机器学习--预测分析核心算法>一书中的第1章,第1.5节,作者:[美]Michael Bowles(鲍尔斯),更多章节内容可以访问云栖社区"异步社 ...

最新文章

  1. 关于java代码生成器---上篇之原理
  2. Socket,SocketImpl与SocketImplFactory的关系
  3. 【bzoj3866】The Romantic Hero dp
  4. 面向对象的C语言编程-DynamicLinkageGenericFunctions--C语言中的偷梁换柱
  5. python中class __str__怎么用_python中下划线的作用
  6. Hadoop入门(八)Mapreduce高级shuffle之Partitioner
  7. android onscrolllistener判断到底部,判断RecyclerView是否滑动到底部
  8. IIS锁定是默认设置的 (overrideModeDefault=“Deny“)问题解决
  9. android 屏幕点击录制视频教程,安卓手机怎么屏幕录像,手机屏幕录像详细教程...
  10. 【Spark ML】第 3 章:监督学习
  11. CAD曲线快捷键是什么?CAD画曲线教程
  12. 输入一个三位数,再反向输出
  13. 大专计算机课教案,计算机课教案
  14. linux7磁盘挂载大于16T,CentOS6.5挂载超过16T的大容量存储空间,格式化为xfs
  15. 浅谈CMPP3协议架构实现
  16. R语言-matrix生成矩阵
  17. 2009经典语录,雷死人不要钱
  18. 微信小程序解决微信模板消息发送之form表单中有多个submit 按钮
  19. 在mysql中通配符_mysql查询中通配符的使用
  20. 办公室计算机技巧知识,办公室电脑常用技巧有哪些【详解】

热门文章

  1. Python 数据科学手册
  2. sqlserver 软件授权
  3. Java多线程笔记(刘意day23、24)
  4. 理解OAuth2授权框架
  5. Java程序员必备的一些流程图/架构图(拿走不谢)
  6. python 网易云音乐uc缓存转换mp3
  7. java;break语句
  8. ET2017万能免狗安装包(不弹窗)
  9. 计算机组成原理 笔记 第二版 唐朔飞
  10. python文本自动伪原创_自动写文章神器:6款在线Ai伪原创工具推荐。