KNN(K-近邻),全称K-Nearest Neighbors,是一种常用的分类算法
KNN算法的历史可以追溯到1957年,当时Cover和Hart提出了“最近邻分类”的概念。
但是,这个算法真正得到广泛认知和应用是在1992年,由Altman发表的一篇名为“K-Nearest Neighbors”的文章。

近年来,随着大数据和机器学习的快速发展,KNN算法因其简单且表现优秀,被广泛应用于各种数据分类问题中。

1. 算法概述

KNN算法的基本原理是:在特征空间中,如果一个样本的最接近的k个邻居中大多数属于某一个类别,则该样本也属于这个类别。
换句话说,KNN算法假设类别是由其邻居决定的。

那么,KNN算法判断数据是否相似是关键,也就是数据之间的距离是如何计算的呢?
最常用的距离计算公式有:

  1. 曼哈顿距离:\(L_1(x_i,x_j)= \sum_{l=1}^{n} |x_i^{(l)}-x_j^{(l)}|\)
  2. 欧氏距离:\(L_2(x_i,x_j) = (\sum_{l=1}^{n} \; |x_i^{(l)}-x_j^{(l)}|^{2})^{\frac{1}{2}}\)
  3. 闵可夫斯基距离:\(L_p(x_i,x_j) = (\sum_{l=1}^{n} \; |x_i^{(l)}-x_j^{(l)}|^{2})^{\frac{1}{p}}\)
  4. 等等

使用不同的距离,就会得到不同的分类效果。

2. 创建样本数据

这次用scikit-learn中的样本生成器make_classification来生成分类用的样本数据。

import matplotlib.pyplot as plt
from sklearn.datasets import make_classification # 分类数据的样本生成器
X, y = make_classification(n_samples=1000, n_classes=4, n_clusters_per_class=1)
plt.scatter(X[:, 0], X[:, 1], marker="o", c=y, s=25) plt.show()


关于样本生成器的详细内容,请参考:TODO

3. 模型训练

首先,分割训练集测试集

from sklearn.model_selection import train_test_split

# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

这次按照8:2的比例来划分训练集和测试集。

然后用scikit-learn中的KNeighborsClassifier模型来训练:

from sklearn.neighbors import KNeighborsClassifier

# 定义KNN模型(设置4个分类,因为样本数据是4个分类)
reg = KNeighborsClassifier(n_neighbors=4) # 训练模型
reg.fit(X_train, y_train) # 在测试集上进行预测
y_pred = reg.predict(X_test)

KNeighborsClassifier的主要参数包括:

  1. n_neighbors:这是kNN算法中的k值,即选择最近的k个点。默认值为5。
  2. weights:此参数默认为'uniform',也可以设置为'distance',或者用户自定义的函数。其中,'uniform'表示所有的邻近点的权重都是相等的,'distance'表示距离近的点比距离远的点的影响大。
  3. algorithm:此参数默认为'auto',也可以设置为'auto','ball_tree','kd_tree',或'brute'。这决定了在计算最近邻时使用的算法。
  4. leaf_size:此参数默认为30,也可以设置为一个整数,用于指定传递给构建叶子节点时使用的最小样本数。
  5. p:此参数默认为2,也可以设置为一个值<=1。这决定了在计算Minkowski距离度量时使用的p值。
  6. metric:此参数默认为'minkowski',也可以设置为'euclidean','manhattan'等。这决定了距离度量方法。
  7. metric_params:此参数默认为None,也可以是一个字典,包含了额外的关键字参数传递给距离度量函数。
  8. n_jobs:此参数默认为None,也可以是一个大于等于1的整数,表示可用于执行并行计算的CPU数量。

最后验证模型的训练效果:

# 比较测试集中有多少个分类预测正确
correct_pred = np.sum(y_pred == y_test) print("预测正确率:{}%".format(correct_pred/len(y_pred)*100)) # 运行结果
预测正确率:68.5%

模型使用了默认的参数,可以看出,模型正确率不高。
感兴趣的同学可以试试调整KNeighborsClassifier的参数,看看是否可以提高模型的预测正确率。

4. 总结

KNN算法被广泛应用于各种不同的应用场景,如图像识别、文本分类、垃圾邮件识别、客户流失预测等。
这些场景的一个共同特点是,需要对一个未知的样本进行快速的分类或预测。

KNN算法主要优势在于:

  1. 简单直观KNN算法的概念简单直观,容易理解和实现。
  2. 适用于小样本数据KNN算法在小样本数据上的表现往往优于其他机器学习算法。
  3. 对数据预处理要求较低KNN算法不需要对数据进行复杂的预处理,例如标准化、归一化等。

不过,KNN算法也有不足之处:

  1. 计算量大:对于大型数据集,KNN算法可能需要大量的存储空间和计算时间,因为需要计算每个样本与所有已知样本的距离。
  2. 选择合适的K值困难K值的选择对结果影响很大,选择不当可能会导致结果的不稳定。
  3. 对噪声数据敏感:如果数据集中存在噪声数据,KNN算法可能会受到较大影响。

【scikit-learn基础】--『监督学习』之 K-近邻分类的更多相关文章

  1. K近邻分类算法实现 in Python

    K近邻(KNN):分类算法 * KNN是non-parametric分类器(不做分布形式的假设,直接从数据估计概率密度),是memory-based learning. * KNN不适用于高维数据(c ...

  2. 查看neighbors大小对K近邻分类算法预测准确度和泛化能力的影响

    代码: # -*- coding: utf-8 -*- """ Created on Thu Jul 12 09:36:49 2018 @author: zhen &qu ...

  3. 每日一个机器学习算法——k近邻分类

    K近邻很简单. 简而言之,对于未知类的样本,按照某种计算距离找出它在训练集中的k个最近邻,如果k个近邻中多数样本属于哪个类别,就将它判决为那一个类别. 由于采用k投票机制,所以能够减小噪声的影响. 由 ...

  4. Python基础『一』

    内置数据类型 数据名称 例子 数字: Bool,Complex,Float,Integer True/False; z=a+bj; 1.23; 123 字符串: String '123456' 元组: ...

  5. Python基础『二』

    目录 语句,表达式 赋值语句 打印语句 分支语句 循环语句 函数 函数的作用 函数的三要素 函数定义 DEF语句 RETURN语句 函数调用 作用域 闭包 递归函数 匿名函数 迭代 语句,表达式 赋值 ...

  6. Python机器学习基础教程-第2章-监督学习之K近邻

    前言 本系列教程基本就是摘抄<Python机器学习基础教程>中的例子内容. 为了便于跟踪和学习,本系列教程在Github上提供了jupyter notebook 版本: Github仓库: ...

  7. 『Kaggle』Sklearn中几种分类器的调用&词袋建立

    几种分类器的基本调用方法 本节的目的是基本的使用这些工具,达到熟悉sklearn的流程而已,既不会设计超参数的选择原理(后面会进行介绍),也不会介绍数学原理(应该不会涉及了,打公式超麻烦,而且近期也没 ...

  8. 机器学习经典算法具体解释及Python实现--K近邻(KNN)算法

    (一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值 ...

  9. 1.K近邻算法

    (一)K近邻算法基础 K近邻(KNN)算法优点 思想极度简单 应用数学知识少(近乎为0) 效果好 可以解释机器学习算法使用过程中的很多细节问题 更完整的刻画机器学习应用的流程 图解K近邻算法 上图是以 ...

  10. 机器学习PR:k近邻法分类

    k近邻法是一种基本分类与回归方法.本章只讨论k近邻分类,回归方法将在随后专题中进行. 它可以进行多类分类,分类时根据在样本集合中其k个最近邻点的类别,通过多数表决等方式进行预测,因此不具有显式的学习过 ...

随机推荐

  1. 记一次 .NET 某电力系统 内存暴涨分析

    一:背景 1. 讲故事 前些天有位朋友找到我,说他生产上的程序有内存暴涨情况,让我帮忙看下怎么回事,最简单粗暴的方法就是让朋友在内存暴涨的时候抓一个dump下来,看一看大概就知道咋回事了. 二:Win ...

  2. 3DMatch

    详细描述链接:3DMatch 数据集.github(介绍非常详细) 官网主页: 主页 3DMatch数据集收集了来自于62个场景的数据,其中54个场景的数据用于训练,8个场景的数据用于评估,其具体名称 ...

  3. 文心一言 VS 讯飞星火 VS chatgpt (109)-- 算法导论10.1 7题

    七.用go语言,说明如何用两个队列实现一个栈,并分析相关栈操作的运行时间. 文心一言: 在Go语言中,我们可以用两个队列(queue1和queue2)实现一个栈.以下是实现代码: package ma ...

  4. 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(9) -- 实现系统动态菜单的配置和权限分配

    在WPF应用端开发,它的界面类似于Winform端,因此我们也需要对系统的菜单进行动态配置,这样才能把系统的功能弹性发挥到极致,通过动态菜单的配置方式,我们可以很容易的为系统新增所需的功能,通过权限分 ...

  5. Kubernetes网络

    kubernetes-Service 1.service存在的意义 1.防止破的失联(服务发现) 2.定义一组pod的访问策略(提供负载均衡) 2.pod与service的关系 1.通过lablel- ...

  6. 比较并交换(compare and swap, CAS)

    比较并交换(compare and swap, CAS),是原子操作的一种,可用于在多线程编程中实现不被打断的数据交换操作,从而避免多线程同时改写某一数据时由于执行顺序不确定性以及中断的不可预知性产生 ...

  7. Util应用框架基础(二) - 对象到对象映射(AutoMapper)

    本节介绍Util应用框架相似对象之间的转换方法. 文章分为多个小节,如果对设计原理不感兴趣,只需阅读基础用法部分即可. 概述 现代化分层架构,普遍采用了构造块DTO(数据传输对象). DTO是一种参数 ...

  8. Error running 'TestAlterNickname.test': Command line is too long. Shorten command line for TestAlterNickname.test or also for JUnit default configuration

    问题描述 如图IDEA报错问题,发生在我用JUnit进行测试时. 解决方法 1. 直接点击 default 2. Modify options -> Shorten command line 3 ...

  9. Net 高级调试之六:对象检查之值类型、应用类型、数组和异常的转储

    一.简介 今天是<Net 高级调试>的第六篇文章.记得我刚接触 Net 框架的时候,还是挺有信心的,对所谓的值类型和引用类型也能说出自己的见解,毕竟,自己一直在努力.当然这些见解都是书本上 ...

  10. 持续集成指南:GitHubAction 自动构建+部署AspNetCore项目

    前言 之前研究了使用 GitHub Action 自动构建和发布 nuget 包:开发现代化的.NetCore控制台程序:(4)使用GithubAction自动构建以及发布nuget包 现在更进一步, ...