机器学习算法总结--K近邻

参考文章:

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

简介

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

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

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

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

三要素

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

k值的选择

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

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

距离的度量

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

Lp(xi,xj)=(l=1n|x(l)ix(l)j|p)1p

这里xi=(x(1)i,x(2)i,...x(n)i)T,xj=(x(1)j,x(2)j,...,x(n)j)T,然后p1

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

L2(xi,xj)=(l=1n|x(l)ix(l)j|2)12

p=1,称为曼哈顿距离,即
L1(xi,xj)=l=1n|x(l)ix(l)j|

p=,它是各个坐标距离的最大值,即
L(xi,xj)=maxl|x(l)ix(l)j|

马氏距离如下定义:

这里写图片描述

KNN的回归

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

优缺点

优点

  1. 思想简单,理论成熟,既可以用来做分类也可以用来做回归;
  2. 可用于非线性分类;
  3. 训练时间复杂度为O(n)

    • 准确度高,对数据没有假设,对异常值不敏感;
    • 缺点

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

      KD树

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

      构造KD树

      在k维的空间上循环找子区域的中位数进行划分的过程。
      假设现在有K维空间的数据集T=x1,x2,x3,xn,xi=a1,a2,a3..ak

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

      KD树的搜索

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

      KD树进行KNN查找

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

      KD树搜索的复杂度

      当实例随机分布的时候,搜索的复杂度为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前预处理数据,例如去除异常值,噪音等。

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

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

相关文章

机器学习算法总结--提升方法

参考自&#xff1a; 《统计学习方法》浅谈机器学习基础&#xff08;上&#xff09;Ensemble learning:Bagging,Random Forest,Boosting 简介 提升方法(boosting)是一种常用的统计学习方法&#xff0c;在分类问题中&#xff0c;它通过改变训练样本的权重&#xff0c;学习多个分…

matlab画x的1 3次方,如何用Matlab画出f(x)=f(x-1)+2的x次方*3的图像

如何用Matlab画出f(x)f(x-1)2的x次方*3的图像以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;如何用Matlab画出f(x)f(x-1)2的x次方*3的图像你要画的范围假设是0到10Fzeros(1,10);F(1)1;要有初…

机器学习算法总结--GBDT

参考如下 机器学习&#xff08;四&#xff09;— 从gbdt到xgboost机器学习常见算法个人总结&#xff08;面试用&#xff09;xgboost入门与实战&#xff08;原理篇&#xff09; 简介 GBDT是一个基于迭代累加的决策树算法&#xff0c;它通过构造一组弱的学习器&#xff08;树&a…

机器学习算法总结--EM算法

参考自 《统计学习方法》机器学习常见算法个人总结&#xff08;面试用&#xff09;从最大似然到EM算法浅解&#xff08;EM算法&#xff09;The EM Algorithm 简介 EM算法&#xff0c;即期望极大算法&#xff0c;用于含有隐变量的概率模型的极大似然估计或极大后验概率估计&am…

CPP第四版第四章:创建动态数组

数组类型的变量有三个重要限制&#xff1a; 数组长度固定不变 在编译时必须知道其长度 数组只在定义它的块语句内存在 每一个程序在执行时都占用一块可用的内存空间&#xff0c;用于存放动态分配的对象&#xff0c;此内存空间称为程序的自由存储区或堆…

(转)非极大抑制(Non-Maximum Suppression)

转载自非极大抑制&#xff08;Non-Maximum Suppression&#xff09;。 参考文章&#xff1a; 1. Non-Maximum Suppression for Object Detection in Python 2. NMS非极大值抑制 最近在做人脸识别的项目&#xff0c;其中在人脸检测算法中MTCNN算法是用到了NMS算法来筛选候选…

安装配置Eclipse开发PHP环境配置

文章结束给大家来个程序员笑话&#xff1a;[M] Eclipse发开PHP环境配置 首先准备好件软&#xff1a; 1. Apache,到这里找个最新本版 2. PHP&#xff0c;到这里下载 3. Eclipse IDE for Java EE Developers&#xff0c;到这里下载 4. DLTK Core Frameworks 1.0 Integration buil…

C++ 输入一行未知个数的整数

最近笔试的时候&#xff0c;编程题遇到这样要求的输入&#xff0c;需要输入一行整数&#xff0c;个数未知&#xff0c;然后整数之间用空格间隔&#xff0c;如下所示&#xff1a; 11 22 333 45 62 代码如下所示&#xff1a; int main() {vector<int> inputs;int n 0, …

[原]好玩的Linux,关于时间cal命令

我们都知道&#xff0c;在Linux中&#xff0c;可以通过cal命令来查看日历。Cal怎么用呢&#xff0c;我们可以man一下&#xff0c;可以看到如下结果&#xff1a; 我们可以看到cal命令的基本用法如下&#xff1a;cal [-smjy13] [[[day] month] year] 当然如果不加指定参数的话&a…

python appium自动化测试平台开发,Python+Appium实现自动化测试

一、环境准备1.脚本语言&#xff1a;Python3.x IDE&#xff1a;安装Pycharm2.安装Java JDK 、Android SDK3.adb环境&#xff0c;path添加E:\Software\Android_SDK\platform-tools4.安装Appium for windows&#xff0c;官网地址http://appium.io/点击下载按钮会到GitHub的下载…

基于CNN的增量学习论文的读后感

最近在阅读几篇基于CNN的增量学习的论文。 《INCREMENTAL LEARNING WITH PRE-TRAINED CONVOLUTIONAL NEURAL NETWORKS AND BINARY ASSOCIATIVE MEMORIES》 09-19 阅读 第一篇论文是《INCREMENTAL LEARNING WITH PRE-TRAINED CONVOLUTIONAL NEURAL NETWORKS AND BINARY ASSOC…