K近邻(K-Nearest Neighbor, KNN)是一种最经典和最简单的有监督学习方法之一,它非常有效而且易于掌握。

1 K近邻算法概述

一个样本与数据集中的k个样本最相似, 如果这k个样本中的大多数属于某一个类别, 则该样本也属于这个类别。也就是说,该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。KNN方法在类别决策时,只与极少量的相邻样本有关。第一个字母k可以小写,表示外部定义的近邻数量。

2 K近邻算法的重点

2.1 距离度量

K近邻算法中一个重要的问题是计算样本之间的距离,以确定训练样本中哪些样本与测试样本更加接近。
​ 在实际应用中,我们往往需要根据应用的场景和数据本身的特点来选择距离计算方法。当已有的距离方法不能满足实际应用需求时,还需要针对性地提出适合具体问题的距离度量方法。k近邻算法对距离的计算方式有多种,其中以Manhattan 距离与Euclidean 距离为主。

Manhattan 距离

Euclidean 距离

当已有距离度量方法不能满足需求时,应该探索符合需求的距离度量方法。

2.2 K值的选择

k近邻算法对样本的分类及其依赖于k的取值。k值不可取过大或过小。

一般而言,从k = 1 k = 1k=1开始,随着的逐渐增大,K近邻算法的分类效果会逐渐提升;在增大到某个值后,随着的进一步增大,K近邻算法的分类效果会逐渐下降。

k值越大,模型的偏差越大,对噪声数据越不敏感,当k值很大时,可能造成欠拟合;

k值越小,模型的方差就会越大,当k值太小,就会造成过拟合。

3 K近邻算法的优缺点

优点:精度高,对异常值不敏感,无输入数据假定

缺点:计算复杂度高,空间复杂度高

4 实现K近邻算法

本次实验调用鸢尾花Iris数据集,利用k近邻算法训练该数据集并评估模型准确率。

4.1 介绍鸢尾花Iris数据集

Iris flower数据集是1936年由Sir Ronald Fisher引入的经典多维数据集,可以作为判别分析(discriminant analysis)的样本。该数据集包含Iris花的三个品种(Iris setosa, Iris virginica and Iris versicolor)各50个样本,每个样本还有4个特征参数(分别是萼片的长宽和花瓣的长宽,以厘米为单位)sepal length (cm), sepal width (cm), petal length (cm), petal width (cm)该数据集成为了机器学习中各种分类技术的典型实验案例。

数据集中的数据与结构如下

4.2 实现对iris数据集的k近邻算法分类及预测

一.导入库

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import numpy as np

二.处理数据集

iris = load_iris()
#date为特征数据集
data = iris.get("data")
#target为标记数据集
target = iris.get("target")
#划分测试集占20%
x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=0)

三.定义k值

KNN = KNeighborsClassifier(n_neighbors=5)

四.评估模型准确率

    KNN.fit(x_train, y_train)train_score = KNN.score(x_train, y_train)test_score = KNN.score(x_test, y_test)print("模型的准确率:", test_score)

五.预测未知种类的样本

prediction = KNN.predict(X1)

完整代码

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
if __name__ == '__main__':iris = load_iris()#date为特征数据集data = iris.get("data")#target为标记数据集target = iris.get("target")#划分测试集占20%x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=0)#定义k值KNN = KNeighborsClassifier(n_neighbors=5)KNN.fit(x_train, y_train)train_score = KNN.score(x_train, y_train)test_score = KNN.score(x_test, y_test)print("模型的准确率:", test_score)#定义三个测试数据X1 = np.array([[1.9, 2.8, 4.7, 1.1], [5.8, 2.7, 4.1, 1.5], [3.6, 2.5, 3.1, 2.1]])prediction = KNN.predict(X1)#根据预测值找出对应花名a = iris.get("target_names")[prediction]print("第一朵花的种类为:", a[0])print("第二朵花的种类为:", a[1])print("第三朵花的种类为:", a[2])

运行结果

5 实际情况产生的问题

通过何种方法寻找测试样本的“近邻”,即如何计算样本之间的距离或相似度?

如何选择K值的大小才能达到最好的预测效果?

当训练样本或者变量维度很大时,如何更快地进行预测?

机器学习:K近邻算法(K-NN)相关推荐

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

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

  2. 机器学习算法系列之K近邻算法

    本系列机器学习的文章打算从机器学习算法的一些理论知识.python实现该算法和调一些该算法的相应包来实现. 目录 K近邻算法 一.K近邻算法原理 k近邻算法 通俗解释 近邻距离的度量 k值的选择 KN ...

  3. 机器学习第七章之K近邻算法

    K近邻算法(了解) 7.1 K近邻算法 7.1.1 K近邻算法的原理介绍 7.1.2 K近邻算法的计算步骤及代码实现 7.2 数据预处理之数据归一化 7.2.1 min-max标准化 7.2.2 Z- ...

  4. 机器学习[k近邻算法]

    k近邻算法简称kNN算法,由Thomas等人在1967年提出[1].它基于以下思想:要确定一个样本的类别,可以计算它与所有训练样本的距离,然后找出和该样本最接近的k个样本,统计这些样本的类别进行投票, ...

  5. python k近邻算法_python中的k最近邻居算法示例

    python k近邻算法 K最近邻居(KNN) (K-Nearest Neighbors (KNN)) KNN is a supervised machine learning algorithm t ...

  6. java实现k 近邻算法_K近邻算法哪家强?KDTree、Annoy、HNSW原理和使用方法介绍

    1.什么是K近邻算法 K近邻算法(KNN)是一种常用的分类和回归方法,它的基本思想是从训练集中寻找和输入样本最相似的k个样本,如果这k个样本中的大多数属于某一个类别,则输入的样本也属于这个类别. 关于 ...

  7. k近邻算法 (KNN)

    k近邻算法 k近邻算法(KNN,K-NearestNeighbor)是一种基本分类和回归方法,监督学习算法,本质上是基于一种数据统计的方法: 核心思想:给定一个训练数据集,对新的输入实例,在训练数据集 ...

  8. k近邻算法,朴素贝叶斯算法,分类模型评估,模型调优

    k近邻算法,朴素贝叶斯算法,分类模型评估,模型调优 k近邻算法 k近邻算法概述 k近邻算法代码实现 k近邻算法的评价 朴素贝叶斯算法 朴素贝叶斯算法概述 朴素贝叶斯代码实现 朴素贝叶斯的评价 分类模型 ...

  9. 【机器学习入门】(1) K近邻算法:原理、实例应用(红酒分类预测)附python完整代码及数据集

    各位同学好,今天我向大家介绍一下python机器学习中的K近邻算法.内容有:K近邻算法的原理解析:实战案例--红酒分类预测.红酒数据集.完整代码在文章最下面. 案例简介:有178个红酒样本,每一款红酒 ...

  10. 【白话机器学习】算法理论+实战之K近邻算法

    作者1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻 ...

最新文章

  1. 子shell中使用相关的环境变量
  2. 63.死锁和死锁的原因
  3. 【干货】求之不得的 Java 文档教程大汇总!
  4. QT的QMatrix类的使用
  5. spark中的ALS
  6. SAP Spartacus 因为 refresh token 刷新令牌过期后显示用户重新登录页面的逻辑
  7. mac地址容量的作用_IP地址冲突网络故障排查案例
  8. Android7.1 音频声音控制策略
  9. 算法题解:旅行商(TSP)问题JAVA算法求解
  10. myeclipse下载_资源共享:常用的编程软件下载链接分享
  11. C#一种简单处理假死的方法
  12. 【信息系统项目管理师】信息系统项目管理师计算题汇总
  13. iOS 程序员、架构师、技术经理、技术总监和CTO有啥区别?
  14. Pytorch基础学习(第一章-PyTorch基础概念)
  15. IT职场人生:学外语
  16. 如何把SQL表格发给别人直接使用
  17. Node.js 15 正式版发布
  18. 企业信息管理系统(4)_用户查询
  19. 【高效生活】巧画甘特图
  20. 查看一个人发表的SCI数量

热门文章

  1. java理解向上转型和向下转型
  2. null与空字符串区别
  3. Linux 中 sudo和su的区别
  4. 使用 Visual Studio 分析器找出应用程序瓶颈(转)
  5. 计算机表演赛vr创意大赛,2017年计算机表演赛增设新项目VR创意大赛开始创意征集...
  6. 苹果公司开发者账号申请流程
  7. 阜南携手亚信安全 共筑“智慧阜南”安全网
  8. c++ 观察者模式(发布—通知)
  9. python消费datahub_datahub消费数据
  10. 树莓派用网线直连笔记本电脑