机器学习实战——K-近邻法(K-Nearest Neighbors,KNN)

 ✨个人主页欢迎您的访问 ✨期待您的三连 ✨

 ✨个人主页欢迎您的访问 ✨期待您的三连 ✨

  ✨个人主页欢迎您的访问 ✨期待您的三连✨

  ​​​

​​

在机器学习的广阔领域中,K-近邻法(KNN) 是一种既简单又强大的非参数分类方法。尽管其原理简单,但 KNN 在许多实际应用中仍然表现出色,尤其是在数据分布比较平滑、特征空间不复杂的情况下。本文将深入探讨 KNN 的原理、实现代码、应用场景、常用数据集及相关文献,帮助你更好地理解这一经典算法。

一、K-近邻法(KNN)的原理✨✨

KNN 是一种基于实例的学习算法,也就是说它没有显式的训练过程,而是直接使用训练数据进行预测。在分类问题中,KNN 的核心思想是:给定一个新的输入实例,查找训练集中最接近(即距离最近)的 K 个实例,并根据这 K 个邻居的标签进行预测。KNN 是一种 懒惰学习算法,即它在训练时不做任何处理,所有计算都在预测阶段进行。

1.1 算法流程
  1. 训练阶段:KNN 在训练阶段不做任何实际的模型拟合或学习,而是直接存储训练数据集。
  2. 预测阶段:对于每一个待预测的样本:
    • 计算待预测样本与训练数据集中所有样本之间的距离。
    • 根据距离的排序,选择距离最近的 K 个邻居。
    • 对 K 个邻居的类别标签进行投票,选出出现频率最高的类别作为预测结果。
1.2 距离度量

KNN 需要一个度量来计算样本之间的距离,常见的距离度量包括:

  • 欧氏距离(Euclidean Distance):最常用的距离度量,适用于连续型特征的情况。其计算公式为:

d(\mathbf{x},\mathbf{y})=\sqrt{\sum_{i=1}^n(x_i-y_i)^2}

  • 曼哈顿距离(Manhattan Distance):适用于特征之间差异较大或有稀疏特征的情况。其计算公式为:

d(\mathbf{x},\mathbf{y})=\sum_{i=1}^n|x_i-y_i|

  • 马氏距离(Mahalanobis Distance):在考虑特征的协方差时适用,尤其适用于样本具有相关性的情况。

1.3 超参数

KNN 算法的一个重要超参数是 K,即选择多少个邻居来进行预测。K 值的选择影响预测的准确性:

  • 小的 K 值:可能会对噪声数据敏感,导致过拟合。
  • 大的 K 值:可能会导致欠拟合,无法捕捉到数据的局部结构。

通常,通过交叉验证(Cross-validation)选择最佳的 K 值。

1.4 优缺点
  • 优点

    • 简单直观,易于理解和实现。
    • 不需要模型的训练过程,适合少量数据的快速实验。
    • 对于数据分布平滑的情况表现良好。
  • 缺点

    • 计算量大:每次预测都需要计算与所有训练样本的距离,计算成本较高。
    • 对高维数据效果较差,容易遇到“维度灾难”问题。
    • 对噪声数据敏感:如果数据中包含很多噪声或离群点,可能会影响预测的准确性。

二、KNN算法的实现代码✨✨

下面,我们通过 Python 和 Scikit-learn 库来实现 KNN 算法,并进行分类任务。

2.1 安装 Scikit-learn

首先,确保安装了 scikit-learn 和 matplotlib 库

pip install scikit-learn matplotlib
2.2 代码实现
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# 加载数据集
data = load_iris()
X = data.data
y = data.target

# 数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 创建KNN分类器
k = 5
knn = KNeighborsClassifier(n_neighbors=k)

# 训练KNN模型
knn.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = knn.predict(X_test)

# 输出准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy of KNN classifier with k={k}: {accuracy:.4f}")

# 绘制分类结果
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_pred, cmap=plt.cm.Paired)
plt.title(f"KNN classification results with k={k}")
plt.show()
2.3 代码说明
  1. 我们使用了 Iris 数据集,它是机器学习中经典的多类分类问题数据集。
  2. 数据集首先被分为训练集和测试集,然后对特征进行了标准化。
  3. 使用 KNeighborsClassifier 来创建 KNN 分类器,并设置邻居数为 5。
  4. 最后,我们评估了分类器在测试集上的准确度,并用散点图可视化了预测结果。
代码演示效果

三、常用数据集介绍与下载✨✨

3.1 数据集介绍
  • Iris 数据集:包含 150 个样本,每个样本具有 4 个特征(萼片长度、萼片宽度、花瓣长度、花瓣宽度),用于分类 3 种不同类型的鸢尾花。

    • 数据集地址:Iris Data Set - UCI Repository
  • Wine 数据集:包含 178 个样本,每个样本有 13 个特征,用于分类红酒的 3 个类别。

    • 数据集地址:Wine Data Set - UCI Repository
  • Digits 数据集:包含 1797 个样本,适用于手写数字识别,特征为 8x8 的像素图像。

    • 数据集地址:Digits Data Set - UCI Repository
3.2 数据集的应用

KNN 算法常常用于数据集的分类任务,特别适用于标签清晰、特征分布较为简单的数据集。通过与其他算法(如决策树、SVM、神经网络等)的对比,KNN 在某些小规模数据集上表现优异,但在高维、大规模数据集上可能会面临性能瓶颈。


四、KNN的应用场景✨✨

4.1 图像分类

KNN 算法广泛应用于图像分类任务中,特别是手写数字识别、图像检索等场景。例如,在 MNIST 手写数字数据集上,KNN 算法可以很好地进行数字分类,尽管对于大规模数据集,它可能需要进行适当优化。

4.2 推荐系统

KNN 还可用于推荐系统,通过计算用户之间的相似度,基于相似用户的行为预测目标用户的偏好。例如,在电影推荐系统中,基于用户评分的 KNN 算法可以推荐类似口味的电影。

4.3 异常检测

KNN 可以用于异常检测任务,通过计算样本与其邻居的距离,识别那些与大多数样本有显著差异的异常点。


五、相关论文及链接✨✨

  1. A Survey of K-Nearest Neighbor Algorithms

    • 论文链接:https://ieeexplore.ieee.org/document/8493728
    • 本文详细介绍了 KNN 算法的背景、发展和不同变种,适合对 KNN 算法进行深入研究的读者。
  2. K-Nearest Neighbor Classifiers

    • 论文链接:https://link.springer.com/article/10.1007/s10618-018-0585-3
    • 该论文讨论了 KNN 在分类问题中的表现,并与其他常见的分类算法进行了对比。
  3. Fast K-Nearest Neighbor Search

    • 论文链接:https://www.sciencedirect.com/science/article/pii/S1877050921001200
    • 论文讨论了如何通过优化技术加速 KNN 搜索过程,适用于大规模数据集。

KNN 虽然是一个基础的分类算法,但在实际应用中仍有其独特的优势,特别是在数据量适中的情况下。随着技术的发展,KNN 也逐渐与其他先进算法结合,形成了更加高效的变种,如近似 KNN、加速 KNN 等。这些变种在许多复杂的实际问题中发挥了重要作用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《Opencv》图像的旋转

一、使用numpy库实现 np.rot90(img,-1) 后面的参数为-1时事顺时针旋转,为1时是逆时针旋转。 import cv2 import numpy as np img cv2.imread(./images/kele.png) """方法一""" # 顺时针90度 rot_1 np.rot90(img,-1) # 逆时针90度…

模型 九屏幕分析法

系列文章 分享 模型,了解更多👉 模型_思维模型目录。九屏幕法:全方位分析问题的系统工具。 1 九屏幕分析法的应用 1.1 新产品研发的市场分析 一家科技公司计划开发一款新型智能手机,为了全面评估市场潜力和风险,他们…

_STM32关于CPU超频的参考_HAL

MCU: STM32F407VET6 官方最高稳定频率:168MHz 工具:STM32CubeMX 本篇仅仅只是提供超频(默认指的是主频)的简单方法,并未涉及STM32超频极限等问题。原理很简单,通过设置锁相环的倍频系数达到不同的频率&am…

若依框架--数据字典设计使用和前后端代码分析

RY的数据字典管理: 字典管理是用来维护数据类型的数据,如下拉框、单选按钮、复选框、树选择的数据,方便系统管理员维护。减少对后端的访问,原来的下拉菜单点击一下就需要对后端进行访问,现在通过数据字典减少了对后端的访问。 如…

openEuler 22.04使用yum源最快速度部署k8s 1.20集群

本文目的 openEuler的官方源里有kubernetes 1.20,使用yum源安装是最快部署一个k8s集群的办法 硬件环境 主机名系统架构ipmasteropenEuler release 22.03 (LTS-SP2)arm192.168.3.11edgeopenEuler release 22.03 (LTS-SP2)arm192.168.3.12deviceopenEuler release 22.…

使用宝塔面板,安装 Nginx、MySQL 和 Node.js

使用ssh远程链接服务器 在完成使用ssh远程链接服务器后 可使用宝塔面板,安装 Nginx、MySQL 和 Node.js 宝塔网站 一、远程链接服务器 二、根据服务器系统安装宝塔 wget -O install.sh https://download.bt.cn/install/install_lts.sh && sudo bash inst…

Linux第一课:c语言 学习记录day06

四、数组 冒泡排序 两两比较,第 j 个和 j1 个比较 int a[5] {5, 4, 3, 2, 1}; 第一轮:i 0 n:n个数,比较 n-1-i 次 4 5 3 2 1 // 第一次比较 j 0 4 3 5 2 1 // 第二次比较 j 1 4 3 2 5 1 // 第三次比较 j 2 4 3 2 1 5 // …

油猴支持阿里云自动登陆插件

遇到的以下问题,都已在脚本中解决: 获取到的元素赋值在页面显示,但是底层的value并没有改写,导致请求就是获取不到数据元素的加载时机不定,尤其是弱网情况下,只靠延迟还是有可能获取不到,且登陆…

什么是卷积网络中的平移不变性?平移shft在数据增强中的意义

今天来介绍一下数据增强中的平移shft操作和卷积网络中的平移不变性。 1、什么是平移 Shift 平移是指在数据增强(data augmentation)过程中,通过对输入图像或目标进行位置偏移(平移),让目标在图像中呈现出…

android framework.jar 在应用中使用

在开发APP中&#xff0c;有时会使用系统提供的framework.jar 来替代 android.jar, 在gradle中配置如下&#xff1a; 放置framework.jar 依赖配置 3 优先级配置 gradle.projectsEvaluated {tasks.withType(JavaCompile) {Set<File> fileSet options.bootstrapClasspat…

7.STM32F407ZGT6-RTC

参考&#xff1a; 1.正点原子 前言&#xff1a; RTC实时时钟是很基本的外设&#xff0c;用来记录绝对时间。做个总结&#xff0c;达到&#xff1a; 1.学习RTC的原理和概念。 2.通过STM32CubeMX快速配置RTC。 27.1 RTC 时钟简介 STM32F407 的实时时钟&#xff08;RTC&#xf…

如何开启苹果手机(IOS)系统的开发者模式?

如何开启开发者模式&#xff1f; 一、打开设置二、隐私与安全性三、找到开发者模式四、开启开发者模式------------------------------------------------------------如果发现没有开发者模式的选项一、电脑下载爱思助手二、连接手机三、工具箱——虚拟定位——打开虚拟定位——…

day06_Spark SQL

文章目录 day06_Spark SQL课程笔记一、今日课程内容二、DataFrame详解&#xff08;掌握&#xff09;5.清洗相关的API6.Spark SQL的Shuffle分区设置7.数据写出操作写出到文件写出到数据库 三、Spark SQL的综合案例&#xff08;掌握&#xff09;1、常见DSL代码整理2、电影分析案例…

stable diffusion 量化学习笔记

文章目录 一、一些tensorRT背景及使用介绍1&#xff09;深度学习介绍2&#xff09;TensorRT优化策略介绍3&#xff09;TensorRT基础使用流程4&#xff09;dynamic shape 模式5&#xff09;TensorRT模型转换 二、实操1&#xff09;编译tensorRT开源代码运行SampleMNIST 一、一些…

Python生日祝福烟花

1. 实现效果 2. 素材加载 2个图片和3个音频 shoot_image pygame.image.load(shoot(已去底).jpg) # 加载拼接的发射图像 flower_image pygame.image.load(flower.jpg) # 加载拼接的烟花图 烟花不好去底 # 调整图像的像素为原图的1/2 因为图像相对于界面来说有些大 shoo…

primitive 编写着色器材质

import { nextTick, onMounted, ref } from vue import * as Cesium from cesium import gsap from gsaponMounted(() > { ... })// 1、创建矩形几何体&#xff0c;Cesium.RectangleGeometry&#xff1a;几何体&#xff0c;Rectangle&#xff1a;矩形 let rectGeometry new…

【Linux-多线程】-线程安全单例模式+可重入vs线程安全+死锁等

一、线程安全的单例模式 什么是单例模式 单例模式是一种“经典的&#xff0c;常用的&#xff0c;常考的”设计模式 什么是设计模式 IT行业这么火&#xff0c;涌入的人很多.俗话说林子大了啥鸟都有。大佬和菜鸡们两极分化的越来越严重&#xff0c;为了让菜鸡们不太拖大佬的后…

C语言程序环境和预处理详解

本章重点&#xff1a; 程序的翻译环境 程序的执行环境 详解&#xff1a;C语言程序的编译链接 预定义符号介绍 预处理指令 #define 宏和函数的对比 预处理操作符#和##的介绍 命令定义 预处理指令 #include 预处理指令 #undef 条件编译 程序的翻译环境和执行环…

pytorch torch.isclose函数介绍

torch.isclose 是 PyTorch 中用于比较两个张量是否“近似相等”的函数。它主要用于判断两个张量的对应元素在数值上是否接近&#xff08;考虑了浮点数精度的可能误差&#xff09;。 函数定义 torch.isclose(input, other, rtol1e-05, atol1e-08, equal_nanFalse)参数说明 inpu…

springboot整合h2

在 Spring Boot 中整合 H2 数据库非常简单。H2 是一个轻量级的嵌入式数据库&#xff0c;非常适合开发和测试环境。以下是整合 H2 数据库的步骤&#xff1a; 1. 添加依赖 首先&#xff0c;在你的 pom.xml 文件中添加 H2 数据库的依赖&#xff1a; <dependency><grou…