参考文章:

  • 《统计学习方法》
  • 机器学习常见算法个人总结(面试用)
  • 机器学习系列(9)_机器学习算法一览(附Python和R代码)

简介

k近邻(KNN)是一种基本分类与回归方法。

其思路如下:给一个训练数据集和一个新的实例,在训练数据集中找出与这个新实例最近的kk个训练实例,然后统计最近的kk个训练实例中所属类别计数最多的那个类,就是新实例的类。其流程如下所示:

  1. 计算训练样本和测试样本中每个样本点的距离(常见的距离度量有欧式距离,马氏距离等);
  2. 对上面所有的距离值进行排序;
  3. 选前kk个最小距离的样本;
  4. 根据这kk个样本的标签进行投票,得到最后的分类类别;

KNN的特殊情况是k=1k=1的情况,称为最近邻算法。对输入的实例点(特征向量)xx,最近邻法将训练数据集中与xx最近邻点的类作为其类别。

三要素

  1. kk值的选择
  2. 距离的度量(常见的距离度量有欧式距离,马氏距离)
  3. 分类决策规则(多数表决规则)

k值的选择

  1. kk值越小表明模型越复杂,更加容易过拟合
  2. 但是kk值越大,模型越简单,如果k=Nk=N的时候就表明无论什么点都是训练集中类别最多的那个类

所以一般kk会取一个较小的值,然后用过交叉验证来确定
这里所谓的交叉验证就是将样本划分一部分出来为预测样本,比如95%训练,5%预测,然后kk分别取1,2,3,4,5之类的,进行预测,计算最后的分类误差,选择误差最小的kk

距离的度量

KNN算法使用的距离一般是欧式距离,也可以是更一般的LpL_p距离或者马氏距离,其中LpL_p距离定义如下:

Lp(xi,xj)=(∑l=1n|x(l)i−x(l)j|p)1p

L_p(x_i, x_j) = (\sum_{l=1}^n |x_i^{(l)} - x_j^{(l)} |^p)^{\frac{1}{p}}
这里xi=(x(1)i,x(2)i,...x(n)i)T,xj=(x(1)j,x(2)j,...,x(n)j)Tx_i = (x_i^{(1)}, x_i^{(2)},...x_i^{(n)})^T, x_j = (x_j^{(1)}, x_j^{(2)}, ... , x_j^{(n)})^T,然后p≥1p \ge 1。

当p=2p=2,称为欧式距离,即

L2(xi,xj)=(∑l=1n|x(l)i−x(l)j|2)12

L_2(x_i, x_j) = (\sum_{l=1}^n |x_i^{(l)} - x_j^{(l)} |^2)^{\frac{1}{2}}
当p=1p=1,称为曼哈顿距离,即

L1(xi,xj)=∑l=1n|x(l)i−x(l)j|

L_1(x_i, x_j) = \sum_{l=1}^n |x_i^{(l)} - x_j^{(l)} |
当p=∞p = \infty,它是各个坐标距离的最大值,即

L∞(xi,xj)=maxl|x(l)i−x(l)j|

L_\infty(x_i, x_j) =max_l |x_i^{(l)} - x_j^{(l)} |

马氏距离如下定义:

KNN的回归

在找到最近的kk个实例之后,可以计算这kk个实例的平均值作为预测值。或者还可以给这kk个实例添加一个权重再求平均值,这个权重与度量距离成反比(越近权重越大)。

优缺点

优点

  1. 思想简单,理论成熟,既可以用来做分类也可以用来做回归;
  2. 可用于非线性分类;
  3. 训练时间复杂度为O(n)O(n);
    • 准确度高,对数据没有假设,对异常值不敏感;
    • 缺点

      1. 计算量大;
      2. 样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);
      3. 需要大量的内存;

      KD树

      KD树是一个二叉树,表示对K维空间的一个划分,可以进行快速检索(那KNN计算的时候不需要对全样本进行距离的计算了)

      构造KD树

      在k维的空间上循环找子区域的中位数进行划分的过程。
      假设现在有K维空间的数据集T=x1,x2,x3,…xn,xi=a1,a2,a3..akT={x_1,x_2,x_3,…x_n},x_i={a_1,a_2,a_3..a_k}

      1. 首先构造根节点,以坐标a1a_1的中位数bb为切分点,将根结点对应的矩形局域划分为两个区域,区域1中a1<ba_1,区域2中a1>ba_1>b
      2. 构造叶子节点,分别以上面两个区域中a2a_2的中位数作为切分点,再次将他们两两划分,作为深度1的叶子节点,(如果中位数a2=中位数中位数a_2=中位数,则a2a_2的实例落在切分面)
      3. 不断重复2的操作,深度为jj的叶子节点划分的时候,索取的aia_i 的i=ji=j%k+1,直到两个子区域没有实例时停止

      KD树的搜索

      1. 首先从根节点开始递归往下找到包含xx的叶子节点,每一层都是找对应的xix_i
      2. 将这个叶子节点认为是当前的“近似最近点”
      3. 递归向上回退,如果以xx圆心,以“近似最近点”为半径的球与根节点的另一半子区域边界相交,则说明另一半子区域中存在与xx更近的点,则进入另一个子区域中查找该点并且更新”近似最近点“
      4. 重复3的步骤,直到另一子区域与球体不相交或者退回根节点
      5. 最后更新的”近似最近点“与xx真正的最近点

      KD树进行KNN查找

      通过KD树的搜索找到与搜索目标最近的点,这样KNN的搜索就可以被限制在空间的局部区域上了,可以大大增加效率。

      KD树搜索的复杂度

      当实例随机分布的时候,搜索的复杂度为log(N)log(N),N<script type="math/tex" id="MathJax-Element-47">N</script>为实例的个数,KD树更加适用于实例数量远大于空间维度的KNN搜索,如果实例的空间维度与实例个数差不多时,它的效率基于等于线性扫描

      代码实现

      使用sklearn的简单代码例子:

      #Import Library
      from sklearn.neighbors import KNeighborsClassifier#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
      # Create KNeighbors classifier object model KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5# Train the model using the training sets and check score
      model.fit(X, y)#Predict Output
      predicted= model.predict(x_test)

      最后,在用KNN前你需要考虑到:

      • KNN的计算成本很高
      • 所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。
      • 在进行KNN前预处理数据,例如去除异常值,噪音等。

机器学习算法总结--K近邻相关推荐

  1. 机器学习算法之 K 近邻

    机器学习算法之 K 近邻 所谓"K 近邻(K-nearest neighbor,K-NN)",顾名思义,指的是"K 个最近的邻居",属于一种监督学习的方法. 1 ...

  2. k邻近算法python代码_机器学习算法之K近邻法-Python实现

    一.算法简介 k近邻法(k-nearest neighbor,k-NN)是一种基本的分类方法,输入的是实例的特征向量,对应于特征空间的点,输出结果为实例的类别,可以取多类.对于训练集来说,每个实例的类 ...

  3. 机器学习算法基础——k近邻算法

    23.k-近邻算法以及案例预测入住位置 24.K-近邻算法案例 分类算法-k近邻算法(KNN) 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本 ...

  4. 经典机器学习算法:k近邻法

    基于李航教授的<统计学习方法>,本博客为个人学习笔记. 只记录精华,不讲废话,让看过或没看过的你和我短时间重新领悟该方法. k近邻法(knn)与k-means的比较: 两者共同点: 1.k ...

  5. 机器学习——聚类之k近邻算法及python使用

    聚类算法之k近邻及python使用 什么是k近邻算法 k近邻算法流程 使用sklearn进行代码实现 数据集介绍 标准化 代码实现 写在开头,套用我的老师的一句话目前所有自然学科的前沿都是在研究数学, ...

  6. 机器学习算法之 K 均值聚类

    机器学习算法之 K 均值聚类 本文我们来学习一下另一种经常听到的机器学习算法-- K 均值聚类. 这个名字确实跟"K 近邻"有些相像,但是要明确的是,"K 近邻" ...

  7. 分类算法之K近邻和朴素贝叶斯

    分类算法之K近邻和朴素贝叶斯 K近邻 一个例子弄懂k-近邻 sklearn k-近邻算法API 朴素贝叶斯 概率论基础 贝叶斯公式 拉普拉斯平滑 sklearn朴素贝叶斯实现API K近邻 一个例子弄 ...

  8. 2、python机器学习基础教程——K近邻算法鸢尾花分类

    一.第一个K近邻算法应用:鸢尾花分类 import numpy as np from sklearn.datasets import load_iris from sklearn.model_sele ...

  9. 机器学习-分类之K近邻算法(KNN)原理及实战

    k近邻算法(KNN) 简介 KNN算法是数据挖掘分类技术中最简单的方法之一.它通过测量不同特征值之间的距离进行分类的.其基本思路为:如果一个样本在特征空间中的k个最近邻样本中的大多数属于某一个类别,则 ...

最新文章

  1. java 中常用的类
  2. Linux安装Nodejs
  3. echarts图表第一个案例
  4. css 定位连线_CSS Position(定位)
  5. 【转】visual studio 2012进行C语言开发[图文]
  6. 踩坑记(1)——使用slf4j+logback记录日志
  7. javascript实现汉诺塔动画效果
  8. OpenEIM 从天上飘落下来
  9. Nginx 概述(2)
  10. [Python]一步步安装numpy,matplotlib
  11. Agile Framework的专区上线
  12. Google Chrome 源码下载地址 (Google Chrome Source Code Download)
  13. Ubuntu 16 安装JDK1.8
  14. python使用自制程序_python--自制程序性能检测工具
  15. BOOST库介绍(六)——容器
  16. Proxifier v3.21 standard edition 激活码
  17. 谷歌自动驾驶正式入华,能否掀起“鲶鱼效应”?
  18. 【云原生 | 44】Docker搭建Registry私有仓库之管理访问权限
  19. CAN 总线 之三 CAN 国际标准 ISO 11898 解读
  20. 计算机硬件基础第七章(未完成版)

热门文章

  1. linux make java版本,告诉make是否在Windows或Linux上运行
  2. java gdal postgresql_使用GDAL/OGR操作Postgresql数据库
  3. 机器学习的练功方式(五)——模型选择及调优
  4. 室内定位 - 资料收集
  5. 【树莓派学习笔记】一、烧录系统、(无屏幕)配置Wifi和SSH服务
  6. Linux 设备驱动开发 —— Tasklets 机制浅析
  7. Spring Boot实战:数据库操作
  8. 一个系统中同时使用VC6.0+OpenCV1.0和VS2010+OpenCV2.4.6.0的方法
  9. 手把手教你用好LINQ to SQL(1)
  10. c/c++面试试题(四)