一、KNN算法概述

KNN算法(k-NearestNeighbor),即K最近邻,是一种监督学习(Supervised Learning)算法字面意思是与计算点最近的k个相邻点,意思是说每个样本点都可以用与之最近的k个相邻的点来表示。

KNN是一种分类算法(Classification Algorithm),它所谓的学习过程是基于输入的实例的,类似于懒惰学习(Lazy Learning),即KNN没有明显的学习过程,也就是说没有训练阶段,数据集事先已有了分类和特征值,待收到新样本后直接进行处理,与急切学习(eager learning)相对应。

KNN算法原理比较简单,但是可以解决很多比较经典的问题。KNN的原理大致是:计算待分类的数据点和训练数据集(Training Dataset)中的每个数据点的欧式距离(Euclidean Distance,又称欧几里得距离),然后选取最近的k个数据点,并对这k个点的类别进行频率统计,将这k个点中出现频率最大的类别作为待分类点的距离。

从百度百科中找到了这张图加深理解。

W1、W2、W3是训练数据集,图上这些点分别属于W1、W2、W3这三类,Xu是待分类点,利用KNN算法测得Xu的所在类别大致流程是这样,输入训练数据和Xu,然后计算Xu与每个点的欧式距离,选取最近的5个点,如图,箭头所指的5个点,这五个点中四个是红色,一个是绿色的,所以Xu应该属于红色这个类别,即W1。

具体算法描述

1. 计算待测点到每个training dataset中的点的距离并保存,时间复杂度O(n),空间复杂度O(n)。

2. 选取距离最小的k个点,时间复杂度O(logn),空间复杂度O(k)。

3. 对这k个点进行统计,得到每种类别出现的频率。O(k)

4. 选取频率最大的类别作为待分类点的类别。O(k)

二、关于k值的选取

k值的含义是所选取的临近点数。

k值不能过大也不能过小,不然会严重影响预测结果的准确度。k值过小时异常值或噪声值的影响会过大,例如 k=1 时,距离待测点最近的那个点直接决定待测点的类别,显然是不合理的,也是不准确的。当k过大,距离待测的较远的点也会对待测点的计算产生影响,就失去了k最近邻的意义,例如 k=n 时,即选取数据集中全部的点进行计算,这样待测点的类别完全取决于训练集中那个类别的样本最多,显然也是不合理的。

k值一般不会超过20,上限是n的平方根,即训练集越大,k值应该越大。具体的k值选取应该利用训练集去检验得到一个准确度最高的k值。

三、关于距离的计算

一般情况是使用欧式距离,即欧几里得距离。不过也可以用曼哈顿距离或角度弧度代替,具体问题应该具体分析。

定义

欧几里得度量(euclidean metric)(也称欧氏距离)是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离。 [1]

计算公式

二维空间的公式

两点之间的欧式距离

三维空间的公式

n维空间的公式

四、总结

1. KNN算法比较简单容易理解,处理一些典型问题时的表现也非常好,但是它的时间复杂度和空间复杂度都非常高。

2. KNN对异常值不是很敏感,因为是根据多个近邻平均效果得到最终的分类结果。

3. KNN对于随机分布的数据集分类效果较差,对于类内间距小,类间间距大的数据集分类效果好,而且对于边界不规则的数据效果好于线性分类器。

4. KNN对于样本不均衡的数据效果不好,需要进行改进。改进的方法时对k个近邻数据赋予权重,比如距离测试样本越近,权重越大。

5. KNN很耗时,时间复杂度为O(n),一般适用于样本数较少的数据集,当数据量大时,可以将数据以树的形式呈现,能提高速度,常用的有kd-tree和ball-tree。

(前两点来自《机器学习实战》这本书,后三点来自大佬的博客:https://www.cnblogs.com/jyroy/p/9427977.html#idx_6,卑微的我?)

五、Sklearn代码实现

# -*- coding: utf-8 -*-
# @Author: yezhipeng
# @Date:   2019-08-04 16:26:19
# @Last Modified by:   yezhipeng
# @Last Modified time: 2019-08-04 16:56:43
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifieriris = datasets.load_iris()
iris_x = iris.data
iris_y = iris.target# print(iris_x)
# print(iris_y)x_train,x_test,y_train,y_test = train_test_split(iris_x,iris_y,test_size = 0.3)# 默认打乱数据,避免产生不必要的误差
# print(y_train)# 实例化一个k近邻分类器的对象
knn = KNeighborsClassifier()
# 拟合数据
knn.fit(x_train,y_train)
print(knn.predict(x_test))
print(y_test)

(代码来自莫烦python的“Scikit-learn (sklearn) 优雅地学会机器学习”视频教程中的Knn分类iris花的例子,链接在这里:https://www.bilibili.com/video/av17003173?from=search&seid=14492162154020710353)

后续会补充《机器学习实战》上面的案例,如有错误评论联系更正。

KNN--K近邻算法相关推荐

  1. knn K近邻算法python实现

    本文主要内容: knn K近邻算法原理 sklearn knn的使用,以及cross validation交叉验证 numpy 实现knn knn改进方法 1 knn K近邻算法原理 K近邻算法:给定 ...

  2. 【20210922】【机器/深度学习】KNN (K近邻) 算法详解

    一.算法概念 KNN, K-near neighbor,即最近邻算法.它是一种分类算法,算法思想是:一个样本与数据集中的 k 个样本最相似,如果这 k 个样本中的大多数属于某一个类别,则该样本也属于这 ...

  3. knn(k近邻算法)——matlab

    目录 1. 基本定义 2. 算法原理 2.1 算法优缺点 2.2 算法参数 2.3 变种 3.算法中的距离公式 4.案例实现 4.1 读取数据 4.2 分离训练集和测试集 4.3 归一化处理 4.4  ...

  4. KNN K近邻算法学习

    KNN算法.k-nearest neighbor,或者K-近邻算法是一种经典的机器学习算法,可以完成分类和回归任务. KNN算法主要思想: 对于输入的特征X,选取与他记录最近的K个点,统计这K个点所属 ...

  5. K近邻算法KNN的简述

    什么是KNN K近邻算法又称KNN,全称是K-Nearest Neighbors算法,它是数据挖掘和机器学习中常用的学习算法,也是机器学习中最简单的分类算法之一.KNN的使用范围很广泛,在样本量足够大 ...

  6. 01 K近邻算法 KNN

    01 K近邻算法 KNN k近邻算法基础 等价于 scikit-learn中的机器学习算法封装 训练数据集,测试数据集 分类准确度 超参数 考虑距离权重 更多关于距离的定义 搜索明可夫斯基距离相应的p ...

  7. 【模式识别】实验二:K近邻算法(KNN)

    KNN是模式识别中的经典算法,本次实验就MNIST数据集来做KNN算法的实验,并结合前一次的LDA降维对数据进行进一步处理. 实验报告图片版 pdf版本可以戳这:模式识别实验报告:KNN K近邻算法 ...

  8. 机器学习7/100天-K近邻算法

    Day7 K近邻算法 github: 100DaysOfMLCode What is K-NN k近邻算法是常用的简单分类算法也可用于回归问题. KNN是一个无参的(不需要对数据分布做任何假设).基于 ...

  9. 一文搞懂K近邻算法(KNN),附带多个实现案例

    简介:本文作者为 CSDN 博客作者董安勇,江苏泰州人,现就读于昆明理工大学电子与通信工程专业硕士,目前主要学习机器学习,深度学习以及大数据,主要使用python.Java编程语言.平时喜欢看书,打篮 ...

  10. K近邻算法(KNN)原理小结

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 目录 1. KNN算法原理 2. KNN算法三要素 3. KNN算 ...

最新文章

  1. python stm32f401_NUCLEO-F401RE(STM32F401RE)开发板跑Micropython平台
  2. 曾今的代码系列——获取当天最大流水号存储过程
  3. 连接数据库字符串编辑
  4. throttle_classes 60秒访问10次限制
  5. java实现图片验证码
  6. angular组件-特殊的瀑布流(原创)
  7. oracle数据库两表数据比较
  8. css3中变形与动画(三)
  9. 人体工学腰垫,保腰神器,改善久坐腰酸背痛
  10. Maven集成测试和Spring Restful Services
  11. Mycat安全_SQL拦截白名单---MyCat分布式数据库集群架构工作笔记0033
  12. servlet的应用------request对象和bean实体的反射关系
  13. Layer 7 过滤 (官网介绍)
  14. 查看dll或exe文件的依赖项——使用vs自带的dumpbin工具
  15. fat32文件系统详细介绍_文件系统介绍
  16. 用户根据短信验证码注册
  17. js 实现表格合并单元格
  18. 【科学文献计量】关键词的挖掘与可视化
  19. 用C语言建立一个顺序栈
  20. 2022化工自动化控制仪表考试题及答案

热门文章

  1. Dockerfile best practices
  2. Equals() 和 运算符 == 重载准则 (C# 编程指南)
  3. 网管日志-06.07.13
  4. LeetCode 343. 整数拆分(Integer Break) 25
  5. react里执行shouldComponentUpdate时返回false的后果
  6. 发现电脑上装着liteide,就用golang做一个TCP通讯测试(支持先启动client端和断线重连)...
  7. 扫描文件PDF转换器
  8. get方式乱码post方式不会乱码原因
  9. 拓端tecdat|红圈律所微信公众号图文数据报告
  10. 拓端tecdat|python聚类算法的应用实例