机器学习教程 正在计划编写中,欢迎大家加微信 sinbam 提供意见、建议、纠错、催更。

KNN(K-Nearest Neighbor)是机器学习入门级的分类算法,也是最为简单的算法。它实现将距离近的样本点划为同一类别,KNN 中的K指的是近邻个数,也就是最近的K个点,根据它距离最近的K个点是什么类别来判断属于哪个类别。

思想原理

「人以群分,物语类聚」、「近朱者赤,近墨者黑」是 KNN 的核心思想。这其实和我们在日常生活中评价一个人的方法是一样的,如果你想要知道一个人是怎么样的,那就去找和他关系好的几个人看看对他的评价或者看和他关系好的人是什么样子的,就可以大致判断出他是什么样的人了。

其中的 K 就是 K 个最近的邻居的意思。KNN 的原理就是当预测一个待分类的值 x 的时候,通过计算找出离它距离最近的 K 个样本,然后由这个 K 个样本投票决定 x 归为哪一类。

我们也可以看到实现这个算法的两个核心问题是计算距离和选取 K 的取值。

算法步骤

KNN 算法的步骤:

  • 计算未知实例到所有已知实例的距离;
  • 选择参数 K(下面会具体讲解K值的相关问题)
  • 根据多数表决 ( Majority-Voting ) 规则,将未知实例归类为样本中最多数的类别

更加详细的步骤为:

  1. 计算测试数据与各个样本数据之间的距离,通常为欧式距离;
  2. 按照距离的递增关系进行排序;
  3. 选取距离最小的K个点;
  4. 确定前K个点所在类别的出现频率;
  5. 返回前K个点中出现频率最高的类别作为测试数据的预测分类。

动画演示

以下是一个 KNN 算法的动态演示,他能够根据取不同 K 的值将白点归到不同的类别。

当 K 取值不同的时候,判别的结果是不同的。所以该算法中 K 值如何选择将非常重要,因为它会影响到我们最终的结果。

距离计算

KNN 算法中用样本之间的距离来衡量样本之间的相似度。常用的距离有:

  • 欧氏距离(Euclidean Distance)
  • 曼哈顿距离(Manhattan Distance)
  • 明氏距离(Minkowski Distance)
  • 切比雪夫距离(Chebyshev Distance)
  • 马氏距离
  • 汉明距离
  • 夹角余弦
  • 杰卡德相似系数

其中:

欧式距离最为常用,n 个 p 维样本 x_i 其欧式距离公式如下:

距离的计算本教程会单独做介绍。

特点

算法优点

  • 简单,易于理解,易于实现,无需估计参数。
  • 对数据没有假设,准确度高,对异常点不敏感。

算法缺点

  • 计算量太大,尤其是特征数非常多的时候。每一个待分类文本都要计算它到全体已知样本的距离,才能得到它的第K个最近邻点。
  • 样本不平衡的时候,对稀有类别的预测准确率低。当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。

代码示例

K-Nearest Neighbors 是用于分类和回归的机器学习算法(主要用于分类)。它考虑了不同的质心,并使用欧几里得函数来比较距离。接着分析结果并将每个点分类到组中,以优化它,使其与所有最接近的点一起放置。它使用k个最近邻的多数票对数据进行分类预测。

import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification# Naive Bayes 任务为分类, n_classes=4
import sklearn.naive_bayes as nb# 1. 准备数据,生成一个随机n类分类问题
nb_X_train, nb_y_train = make_classification(n_features=2, n_redundant=0, n_informative=2,random_state=1, n_clusters_per_class=1, n_classes=4)# 2. 构造训练与测试集
l, r = nb_X_train[:, 0].min() - 1, nb_X_train[:, 0].max() + 1
b, t = nb_X_train[:, 1].min() - 1, nb_X_train[:, 1].max() + 1
n = 1000
grid_x, grid_y = np.meshgrid(np.linspace(l, r, n), np.linspace(b, t, n))
nb_X_test = np.column_stack((grid_x.ravel(), grid_y.ravel()))# 3. 训练模型
nb_model = nb.GaussianNB()
nb_model.fit(nb_X_train, nb_y_train)# 4. 预测数据
nb_y_pred = nb_model.predict(nb_X_test)# 5. 可视化
grid_z = nb_y_pred.reshape(grid_x.shape)
plt.figure('Naive Bayes')
plt.title('Naive Bayes')
plt.pcolormesh(grid_x, grid_y, grid_z, cmap='Blues')
plt.scatter(nb_X_train[:, 0], nb_X_train[:, 1], s=30, c=nb_y_train, cmap='pink')
plt.show()

参考

  • https://eunsukimme.github.io/ml/2019/10/20/KNN-classification/

KNN 最近邻算法(K近邻)相关推荐

  1. 09_分类算法--k近邻算法(KNN)、案例、欧氏距离、k-近邻算法API、KNeighborsClassifier、及其里面的案例(网络资料+学习资料整理笔记)

    1 分类算法–k近邻算法(KNN) 定义:如果一个样本在特征空间中**k个最相似(即特征空间中最邻近)**的样本中的大多数属于某一个类别,则该样本也属于这个类别,则该样本也属于这个类别. k-近邻算法 ...

  2. 机器学习算法——K近邻法

    K近邻算法 k近邻算法(k-nearest neighbor,k-NN)是一种基本分类与回归方法.k-近邻算法的输入为实例的特征向量,对应于特征空间的点:输出为实例的类别,可以取多类.k-近邻算法假设 ...

  3. 3. KNN最近邻算法详解与关键技术剖析(理论篇)

    一.KNN算法概述 K最近邻(K-Nearest-Neighbour,KNN)算法可以说是最简单的分类算法,易于理解,其核心思想就是距离的比较,即离谁最近,就被归类于谁(群体投票的方式). 通俗解释: ...

  4. 机器学习-KNN最近邻算法原理及实践

    一.KNN最近邻算法原理 1.KNN(k-nearest neighbor)最近邻算法是一种有监督学习(存在特征标签)能够解决分类与回归问题的方法,是一个理论上比较成熟的.也是最简单的机器学习算法之一 ...

  5. 惰性学习算法 ---- k 近邻算法

    惰性学习算法 ---- k 近邻算法 KNN 是惰性学习算法的典型例子.说它具有 惰性 不是因为它看起来简单,而是因为它仅仅对训练数据集有记忆功能,而不会从训练集中通过学习得到一个函数. 这种基于记忆 ...

  6. 第4章 最基础的分类算法-k近邻算法

    思想极度简单 应用数学知识少 效果好(缺点?) 可以解释机器学习算法使用过程中的很多细节问题 更完整的刻画机器学习应用的流程 distances = [] for x_train in X_train ...

  7. python人工智能——机器学习——分类算法-k近邻算法

    分类算法-k近邻算法(KNN) 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. 来源:KNN算法最早是由Cover和Hart提 ...

  8. OpenCV4学习笔记(55)——基于KNN最近邻算法实现鼠标手写数字识别

    在上一篇博客<OpenCV4学习笔记(54)>中,整理了关于KNN最近邻算法的一些相关内容和一个手写体数字识别的例子.但是上次所实现的手写体数字识别,每次只能固定地输入测试图像进行预测,而 ...

  9. opencv(python)使用knn最近邻算法识别手写数字

    knn最近邻算法是一种分类以及回归算法,算法原理是一个样本与样本集中k个样本最相似,如果这k个样本的大多数也属于同一个类别,则该样本也属于这一类.关于knn算法的详细原理读者可以在网上找一些资料了解下 ...

最新文章

  1. C++中#if 0 ... #endif的用法
  2. mybatis做批量删除时写SQL语句时遇到的问题
  3. Caffe-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)与训练记录
  4. Leetcode 7. 整数反转
  5. 【工作感悟】java编程规范pdf下载
  6. 中世纪判断女巫的方法总结
  7. 开源android手写批注,浅析各阅读平台手写批注 智器阅读显身手
  8. 允许保存文件 html5,html5 保存文件
  9. python链表值讲解_python数据结构之链表的实例讲解
  10. Java 使用Commons-fileupload组件实现上传
  11. junit不启用事务_JUnit禁用启用测试
  12. python实现不使用额外的空间判断输入数字是否是回文数
  13. 二进制空间权重矩阵_Stata_ 空间权重矩阵的构建
  14. telnet测试端口
  15. [Android] 百度地图API Android相关配置教程(包含获取包名、发布版SHA1和开发版SHA1)
  16. Linux - Vim常用命令清单
  17. Normalize.css 支持 HTML5 的CSS Reset
  18. 【解锁】Pandoc——Pandoc安装、使用、快速上手
  19. Android-自定义幸运抽奖转盘
  20. js jq 按钮开始/停止转换

热门文章

  1. 高等数学·同济七版+线性代数第六版+概率论与数理统计第四版(教材+辅导)
  2. PyTorch深度学习入门与实战(案例视频精讲)
  3. win7关闭系统索引服务器,win7系统关闭磁盘索引功能的操作方法
  4. 等比例缩放html5页面,css中如何做到容器按比例缩放
  5. 重磅直播 | PointDSC:基于特征匹配的点云配准方法(CVPR2021)
  6. 三公子论「财务自由」
  7. 比较两个字符串是否相等
  8. Bootstrap下拉菜单组件
  9. UniT | Facebook发布全新智能通用Agent!
  10. 数据包是如何在网络中传输的