K 近邻算法(K-Nearest Neighbors, KNN)详解及案例

K近邻算法(K-Nearest Neighbors, KNN)详解及案例

一、基本原理

K近邻算法是一种监督学习算法,核心思想是“物以类聚,人以群分”:对于一个新样本,通过计算它与训练集中所有样本的“距离”,找出距离最近的K个样本(即“近邻”),再根据这K个近邻的标签(分类问题)或数值(回归问题)推断新样本的结果。

KNN属于“惰性学习(Lazy Learning)”,它没有显式的“训练过程”,不会提前构建模型,而是在预测时直接依赖训练数据进行计算,因此也被称为“实例-based学习”。

二、核心要素与关键步骤

1. 距离度量

距离用于衡量样本间的相似性,距离越小,样本越相似。常用的距离度量包括:

  • 欧氏距离(最常用):适用于连续特征,计算n维空间中两个点的直线距离。
    公式:对于样本x=(x1,x2,...,xn)x=(x_1,x_2,...,x_n)x=(x1,x2,...,xn)y=(y1,y2,...,yn)y=(y_1,y_2,...,y_n)y=(y1,y2,...,yn),欧氏距离为:
    d(x,y)=∑i=1n(xi−yi)2d(x,y)=\sqrt{\sum_{i=1}^{n}(x_i-y_i)^2}d(x,y)=i=1n(xiyi)2

  • 曼哈顿距离:适用于高维数据,计算坐标轴上的“城市街区距离”。
    公式:d(x,y)=∑i=1n∣xi−yi∣d(x,y)=\sum_{i=1}^{n}|x_i-y_i|d(x,y)=i=1nxiyi

  • 余弦相似度:适用于高维稀疏数据(如文本),衡量向量方向的相似性(与模长无关)。
    公式:cos⁡θ=x⋅y∣∣x∣∣⋅∣∣y∣∣=∑i=1nxiyi∑i=1nxi2⋅∑i=1nyi2\cos\theta=\frac{x\cdot y}{||x||\cdot||y||}=\frac{\sum_{i=1}^{n}x_i y_i}{\sqrt{\sum_{i=1}^{n}x_i^2}\cdot\sqrt{\sum_{i=1}^{n}y_i^2}}cosθ=∣∣x∣∣∣∣y∣∣xy=i=1nxi2i=1nyi2i=1nxiyi

2. K值选择

K值是KNN的核心超参数,直接影响预测结果:

  • K值过小:近邻数量少,易受噪声样本影响,导致“过拟合”(模型对训练数据太敏感)。
  • K值过大:近邻包含过多无关样本,导致“欠拟合”(模型忽略局部特征,偏向全局平均)。
  • 常见选择:通常取奇数(避免投票平局),如3、5、7等;实际应用中通过交叉验证(如5折交叉验证)选择最优K值。

3. 决策规则

  • 分类问题:对K个近邻的标签进行“多数投票”(少数服从多数),得票最多的标签即为新样本的预测类别。
  • 回归问题:对K个近邻的数值取“平均值”(或加权平均值),作为新样本的预测值。

4. 核心步骤

  1. 确定距离度量方式(如欧氏距离)和K值;
  2. 计算新样本与训练集中所有样本的距离;
  3. 按距离从小到大排序,选取前K个样本作为“近邻”;
  4. 根据K个近邻的标签(分类)或数值(回归),得到新样本的预测结果。

三、优缺点

优点

  • 简单直观:无需复杂的模型训练,原理易懂,实现难度低;
  • 适应性强:可处理非线性数据,对特征分布无严格假设;
  • 扩展性好:可通过优化距离计算(如KD树、球树)提升效率。

缺点

  • 计算成本高:预测时需与所有训练样本计算距离,样本量过大时速度慢;
  • 对不平衡数据敏感:若某类样本占比极高,K近邻易被其主导;
  • 对噪声和异常值敏感:离群点可能被误判为“近邻”,影响预测结果;
  • 依赖距离度量:高维数据中“距离”的意义会弱化(维度灾难)。

四、案例详情(分类问题:电影类型预测)

问题描述

已知4部电影的特征(搞笑镜头数、打斗镜头数)和标签(喜剧片/动作片),预测一部新电影的类型。

训练数据

电影ID搞笑镜头数(特征1)打斗镜头数(特征2)标签
A3010喜剧片
B205喜剧片
C540动作片
D1030动作片

新样本

待预测电影E:搞笑镜头数=25,打斗镜头数=20,需预测其类型。

预测步骤

步骤1:确定参数

选择欧氏距离作为度量方式,K=3(奇数,避免平局)。

步骤2:计算新样本与训练样本的距离

电影E(25,20)与A、B、C、D的欧氏距离:

  • 与A(30,10)的距离:(25−30)2+(20−10)2=(−5)2+102=25+100=125≈11.18\sqrt{(25-30)^2+(20-10)^2}=\sqrt{(-5)^2+10^2}=\sqrt{25+100}=\sqrt{125}\approx11.18(2530)2+(2010)2=(5)2+102=25+100=12511.18
  • 与B(20,5)的距离:(25−20)2+(20−5)2=52+152=25+225=250≈15.81\sqrt{(25-20)^2+(20-5)^2}=\sqrt{5^2+15^2}=\sqrt{25+225}=\sqrt{250}\approx15.81(2520)2+(205)2=52+152=25+225=25015.81
  • 与C(5,40)的距离:(25−5)2+(20−40)2=202+(−20)2=400+400=800≈28.28\sqrt{(25-5)^2+(20-40)^2}=\sqrt{20^2+(-20)^2}=\sqrt{400+400}=\sqrt{800}\approx28.28(255)2+(2040)2=202+(20)2=400+400=80028.28
  • 与D(10,30)的距离:(25−10)2+(20−30)2=152+(−10)2=225+100=325≈18.03\sqrt{(25-10)^2+(20-30)^2}=\sqrt{15^2+(-10)^2}=\sqrt{225+100}=\sqrt{325}\approx18.03(2510)2+(2030)2=152+(10)2=225+100=32518.03
步骤3:排序并选K=3个近邻

距离从小到大排序:
A(11.18)→ B(15.81)→ D(18.03)→ C(28.28)
前3个近邻为:A、B、D。

步骤4:多数投票
  • 近邻A的标签:喜剧片;
  • 近邻B的标签:喜剧片;
  • 近邻D的标签:动作片;
  • 投票结果:喜剧片(2票)>动作片(1票)。
预测结果

电影E被预测为喜剧片

五、总结

KNN是一种基于“相似性”的简单算法,核心依赖距离度量和K值选择。尽管存在计算成本高的问题,但因其直观性和适应性,在推荐系统、图像识别、文本分类等领域仍被广泛应用(如推荐系统中“相似用户喜欢的商品”推荐)。实际使用时需注意优化样本量和距离计算,以提升效率。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解 Redis 集群化看门狗机制:原理、实践与风险

在分布式系统中,我们常常需要执行一些关键任务,这些任务要么必须成功执行,要么失败后需要明确的状态(如回滚),并且它们的执行时间可能难以精确预测。如何确保这些任务不会被意外中断,或者在长时…

Python机器学习:从零基础到项目实战

目录第一部分:思想与基石——万法归宗,筑基问道第1章:初探智慧之境——机器学习世界观1.1 何为学习?从人类学习到机器智能1.2 机器学习的“前世今生”:一部思想与技术的演进史1.3 为何是Python?——数据科学…

数据库:库的操作

1:查看所有数据库SHOW DATABASES;2:创建数据库CREATE DATABASE [ IF NOT EXISTS ] 数据库名 [ CHARACTER SET 字符集编码 | COLLATE 字符集校验规则 | ENCRYPTION { Y | N } ];[]:可写可不写{}:必选一个|:n 选 1ENCR…

AngularJS 动画

AngularJS 动画 引言 AngularJS 是一个流行的JavaScript框架,它为开发者提供了一种构建动态Web应用的方式。在AngularJS中,动画是一个强大的功能,可以帮助我们创建出更加生动和引人注目的用户界面。本文将详细介绍AngularJS动画的原理、用法以及最佳实践。 AngularJS 动画…

SonarQube 代码分析工具

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 🧠全面掌握 SonarQube:企业代码质量保障的利器 🚀 在当今 DevOps 流水线中,代码…

vmware vsphere esxi6.5 使用工具导出镜像

注:为什么使用这个工具,我这边主要因为esxi6.5自身bug导致web导出镜像会失败一、下载VMware-ovftool到本地系统(根据你的操作系统版本到官网下载安装,此处略)以下内容默认将VMware-ovftool安装到windows 本地系统为例。…

ES 踩坑记:Set Processor 字段更新引发的 _source 污染

问题背景 社区的一个伙伴想对一个 integer 的字段类型添加一个 keyword 类型的子字段,然后进行精确匹配的查询优化,提高查询的速度。 整个索引数据量不大,并不想进行 reindex 这样的复杂操作,就想到了使用 update_by_query 的存量…

如何彻底搞定 PyCharm 中 pip install 报错 ModuleNotFoundError: No module named ‘requests’ 的问题

如何彻底搞定 PyCharm 中 pip install 报错 ModuleNotFoundError: No module named ‘requests’ 的问题 在使用 PyCharm 开发 Python 项目时,ModuleNotFoundError: No module named requests 是一个常见但令人头疼的问题。本篇博文将从环境配置、原因分析到多种解…

powerquery如何实现表的拼接主键

在做表过程中,有时候没有基表,这个时候就要构造完整的主键,这样才可以使之后匹配的数据不会因为主键不全而丢失数据 我的处理方法是吧多个表的主键拼在一起然后去重,构造一个单单之后之间的表作为基表去匹配数据 所以就哟啊用到自…

今日Github热门仓库推荐 第八期

今日Github热门仓库推荐2025-07-22 如果让AI分别扮演 后端开发人员和前端开发人员,然后看看他们分别对github每天的trending仓库感兴趣的有哪些,并且给出他感兴趣的理由,那会发生什么呢? 本内容通过Python AI生成,项…

Dify-13: 文本生成API端点

本文档提供了有关 Dify 中与文本生成相关的 API 端点的全面信息。文本生成 API 支持无会话持久性的单次请求文本生成,使其适用于翻译、摘要、文章写作等非对话式人工智能应用场景。 概述 文本生成 API 端点允许开发人员将 Dify 的文本生成功能集成到不需要维护对话上…

Leetcode 3620. Network Recovery Pathways

Leetcode 3620. Network Recovery Pathways 1. 解题思路2. 代码实现 题目链接:3620. Network Recovery Pathways 1. 解题思路 这一题我最开始想的是遍历一下所有的网络路径,不过遇到了超时的情况。因此后来调整了一下处理思路,使用二分法的…

链路备份技术(链路聚合、RSTP)

一、链路聚合!链路备份技术之一-----链路聚合(Link Aggregation)被视为链路备份技术,核心原因在于它能通过多条物理链路的捆绑,实现 “一条链路故障时,其他链路自动接管流量” 的冗余备份效果,同…

PyTorch新手实操 安装

PyTorch简介 PyTorch 是一个基于 Python 的开源深度学习框架,由 Meta AI(原 Facebook AI)主导开发,以动态计算图(Define-by-Run)为核心,支持灵活构建和训练神经网络模型。其设计理念高度契合科…

Element Plus Table 组件扩展:表尾合计功能详解

前言在现代数据驱动的社会中,数据分析和统计成为了非常重要的任务。为了更有效地分析数据和展示统计结果,前端开发人员可以使用Vue框架和Element Plus组件库来实现数据的统计和分析功能。以下是一个关于如何在 Element Plus 的 el-table 组件中实现行汇总…

神经网络 非线性激活层 正则化层 线性层

神经网络 非线性激活层 作用:增强模型的非线性拟合能力 非线性激活层网络: class activateNet(nn.Module):def __init__(self):super(activateNet,self).__init__()self.relu nn.ReLU()self.sigmoid nn.Sigmoid()def forward(self,input):#output sel…

【Vue进阶学习笔记】组件通信专题精讲

目录前言props 父传子原理说明使用场景代码示例父组件 PropsTest.vue子组件 Child.vue自定义事件 $emit 子传父原理说明使用场景代码示例父组件 EventTest.vue子组件 Event2.vueEvent Bus 兄弟/跨层通信原理说明使用场景代码示例事件总线 bus/index.ts兄弟组件通信示例Child2.v…

【PTA数据结构 | C语言版】求最小生成树的Prim算法

本专栏持续输出数据结构题目集,欢迎订阅。 文章目录题目代码题目 请编写程序,实现在带权的无向图中求最小生成树的 Prim 算法。 注意:当多个待收录顶点到当前点集的距离等长时,按编号升序进行收录。 输入格式: 输入首…

【加解密与C】Rot系列(四)RotSpecial

RotSpecial 函数解析RotSpecial 是一个自定义函数,通常用于处理特定的旋转操作,尤其在图形变换或数据处理中。该函数可能涉及欧拉角、四元数或其他旋转表示方法,具体行为取决于实现上下文。以下是关于该函数的通用解释和可能的使用方法&#…

【机器学习深度学习】LLaMAFactory中的精度训练选择——bf16、fp16、fp32与pure_bf16深度解析

目录 前言 一、 为什么精度如此重要?—— 内存、速度与稳定性的三角博弈 二、 四大精度/模式详解: bf16, fp16, fp32, pure_bf16 三、 关键特性对比表 ▲四大计算类型核心对比表 ▲ 显存占用对比示例(175B参数模型) ▲LLa…