【机器学习基础】机器学习入门核心算法:K-近邻算法(K-Nearest Neighbors, KNN)

在这里插入图片描述

机器学习入门核心算法:K-近邻算法(K-Nearest Neighbors, KNN)

  • 一、算法逻辑
      • 1.1 基本概念
      • 1.2 关键要素
        • 距离度量
        • K值选择
  • 二、算法原理与数学推导
      • 2.1 分类任务
      • 2.2 回归任务
      • 2.3 时间复杂度分析
  • 三、模型评估
      • 3.1 评估指标
      • 3.2 交叉验证调参
  • 四、应用案例
      • 4.1 手写数字识别
      • 4.2 推荐系统
  • 五、经典面试题
      • 问题1:KNN的主要优缺点?
      • 问题2:如何处理高维数据?
      • 问题3:KNN与K-Means的区别?
  • 六、高级优化技术
      • 6.1 数据结构优化
      • 6.2 近似最近邻(ANN)
  • 七、最佳实践指南
      • 7.1 参数调优建议
      • 7.2 特征处理要点
  • 总结与展望

一、算法逻辑

1.1 基本概念

K-近邻算法(KNN)是一种基于实例的监督学习算法,其核心思想是**“物以类聚”**。算法特点包括:

  • 懒惰学习(Lazy Learning):没有显式的训练过程,直接存储全部训练数据
  • 非参数化:不假设数据分布形式
  • 局部近似:仅依赖邻近样本进行预测

工作原理
给定新样本时,在训练集中查找距离最近的K个样本,通过这K个邻居的标签进行多数表决(分类)或均值计算(回归)。

1.2 关键要素

距离度量

常用距离计算公式:

  1. 欧氏距离(默认选择):
    d ( x i , x j ) = ∑ k = 1 n ( x i k − x j k ) 2 d(\boldsymbol{x}_i, \boldsymbol{x}_j) = \sqrt{\sum_{k=1}^n (x_{ik} - x_{jk})^2} d(xi,xj)=k=1n(xikxjk)2
  2. 曼哈顿距离
    d ( x i , x j ) = ∑ k = 1 n ∣ x i k − x j k ∣ d(\boldsymbol{x}_i, \boldsymbol{x}_j) = \sum_{k=1}^n |x_{ik} - x_{jk}| d(xi,xj)=k=1nxikxjk
  3. 闵可夫斯基距离(通用形式):
    d ( x i , x j ) = ( ∑ k = 1 n ∣ x i k − x j k ∣ p ) 1 / p d(\boldsymbol{x}_i, \boldsymbol{x}_j) = \left( \sum_{k=1}^n |x_{ik} - x_{jk}|^p \right)^{1/p} d(xi,xj)=(k=1nxikxjkp)1/p
K值选择
  • K=1:最近邻算法,决策边界不规则,容易过拟合
  • K过大:决策边界平滑,可能欠拟合

二、算法原理与数学推导

2.1 分类任务

多数表决规则
y ^ = arg ⁡ max ⁡ c ∑ x i ∈ N k ( x ) I ( y i = c ) \hat{y} = \arg\max_{c} \sum_{\boldsymbol{x}_i \in N_k(\boldsymbol{x})} I(y_i = c) y^=argcmaxxiNk(x)I(yi=c)
其中:

  • N k ( x ) N_k(\boldsymbol{x}) Nk(x):样本 x \boldsymbol{x} x的K个最近邻
  • I ( ⋅ ) I(\cdot) I():指示函数,条件满足时取1否则0

加权投票改进
y ^ = arg ⁡ max ⁡ c ∑ x i ∈ N k ( x ) w i I ( y i = c ) \hat{y} = \arg\max_{c} \sum_{\boldsymbol{x}_i \in N_k(\boldsymbol{x})} w_i I(y_i = c) y^=argcmaxxiNk(x)wiI(yi=c)
权重计算:
w i = 1 d ( x , x i ) + ϵ w_i = \frac{1}{d(\boldsymbol{x}, \boldsymbol{x}_i) + \epsilon} wi=d(x,xi)+ϵ1
ϵ \epsilon ϵ为防止除零的小常数)

2.2 回归任务

均值预测
y ^ = 1 k ∑ x i ∈ N k ( x ) y i \hat{y} = \frac{1}{k} \sum_{\boldsymbol{x}_i \in N_k(\boldsymbol{x})} y_i y^=k1xiNk(x)yi

加权回归
y ^ = ∑ x i ∈ N k ( x ) w i y i ∑ w i \hat{y} = \frac{\sum_{\boldsymbol{x}_i \in N_k(\boldsymbol{x})} w_i y_i}{\sum w_i} y^=wixiNk(x)wiyi

2.3 时间复杂度分析

阶段时间复杂度说明
训练阶段O(1)仅存储数据
预测阶段O(nd + nlogk)d为维度,n为样本数
优化后O(mlog n)使用KD树/球树结构

三、模型评估

3.1 评估指标

任务类型常用指标公式
分类准确率、F1 Score A c c u r a c y = T P + T N N Accuracy = \frac{TP+TN}{N} Accuracy=NTP+TN
回归MSE、MAE M S E = 1 n ∑ ( y i − y ^ i ) 2 MSE = \frac{1}{n}\sum(y_i-\hat{y}_i)^2 MSE=n1(yiy^i)2

3.2 交叉验证调参

K值选择方法

  1. 肘部法则(Elbow Method):绘制不同K值的误差曲线
  2. 网格搜索:结合交叉验证选择最优K值

代码示例

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCVparams = {'n_neighbors': [3,5,7,9], 'weights': ['uniform', 'distance']}
grid = GridSearchCV(KNeighborsClassifier(), params, cv=5)
grid.fit(X_train, y_train)

四、应用案例

4.1 手写数字识别

数据集:MNIST(60,000张28x28灰度图)
关键步骤

  1. 数据标准化:像素值缩放到[0,1]
  2. 降维处理:使用PCA保留95%方差
  3. 模型配置:K=5,加权距离

性能表现

  • 测试集准确率:97.1%
  • 推理速度:200样本/秒(使用KD树加速)

4.2 推荐系统

应用场景:电影推荐
特征工程

  • 用户评分矩阵
  • 电影类型标签(One-Hot编码)
  • 用户行为时序特征

相似度计算
Similarity ( u , v ) = ∑ i ∈ I u v ( r u i − r ˉ u ) ( r v i − r ˉ v ) ∑ i ∈ I u v ( r u i − r ˉ u ) 2 ∑ i ∈ I u v ( r v i − r ˉ v ) 2 \text{Similarity}(u,v) = \frac{\sum_{i \in I_{uv}}(r_{ui} - \bar{r}_u)(r_{vi} - \bar{r}_v)}{\sqrt{\sum_{i \in I_{uv}}(r_{ui} - \bar{r}_u)^2} \sqrt{\sum_{i \in I_{uv}}(r_{vi} - \bar{r}_v)^2}} Similarity(u,v)=iIuv(ruirˉu)2 iIuv(rvirˉv)2 iIuv(ruirˉu)(rvirˉv)

推荐流程

  1. 查找最相似K个用户
  2. 聚合这些用户的高评分电影
  3. 过滤已观看内容生成推荐列表

五、经典面试题

问题1:KNN的主要优缺点?

优点分析

  • 原理直观,实现简单
  • 无需训练阶段,适合动态数据集
  • 天然支持多分类任务

缺点分析

  • 计算复杂度高(预测阶段需全量计算)
  • 对高维数据敏感(维度灾难)
  • 需要特征标准化处理

问题2:如何处理高维数据?

解决方案

  1. 特征选择:使用互信息、卡方检验等方法筛选重要特征
  2. 降维技术:PCA、t-SNE等
  3. 距离度量改进:使用余弦相似度替代欧氏距离
  4. 数据标准化:Min-Max或Z-Score标准化

问题3:KNN与K-Means的区别?

本质区别对比

维度KNNK-Means
算法类型监督学习无监督聚类
目标分类/回归数据分组
距离计算测试样本与所有训练样本计算样本与聚类中心计算
K值含义最近邻数量聚类中心数量

六、高级优化技术

6.1 数据结构优化

KD树构建

  1. 选择方差最大的维度进行划分
  2. 以中位数作为切分点
  3. 递归构建左右子树

球树(Ball Tree)

  • 将数据点组织成嵌套超球体
  • 适合高维数据,比KD树更高效

6.2 近似最近邻(ANN)

大规模数据加速方法

  1. 位置敏感哈希(LSH):通过哈希函数将相似数据映射到相同桶
  2. 层次导航小世界(HNSW):基于图结构的快速检索
  3. 乘积量化(PQ):将高维向量分解为子空间量化

七、最佳实践指南

7.1 参数调优建议

参数推荐值作用说明
n_neighbors3-15(奇数为佳)控制模型复杂度
weightsdistance加权近邻投票
algorithmauto自动选择最优数据结构
leaf_size30-50控制树结构的存储效率

7.2 特征处理要点

  • 标准化:必须对数值特征进行标准化
  • 类别特征:使用嵌入(Embedding)代替One-Hot
  • 缺失值:使用KNNImputer进行填充

总结与展望

KNN算法凭借其简单直观的特性,在模式识别、推荐系统等领域持续发挥重要作用。未来发展方向包括:

  1. 分布式计算:使用Spark MLlib加速大规模KNN
  2. 深度学习结合:用神经网络学习更好的距离度量
  3. 硬件加速:利用GPU实现实时KNN计算

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

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

相关文章

在h5端实现录音发送功能(兼容内嵌微信小程序) recorder-core

本文将通过一个实际的 Vue3 组件示例,带你一步步实现“按住录音,松开发送,上滑取消”的语音录制功能。 我们将使用强大且小巧的开源库 recorder-core,支持 MP3、WAV、AAC 等编码格式,兼容性较好。 🔧 项目…

深入掌握Node.js HTTP模块:从开始到放弃

文章目录 一、HTTP模块入门:从零搭建第一个服务器1.1 基础概念解析1.2 手把手创建服务器 二、核心功能深入解析2.1 处理不同请求类型2.2 实现文件下载功能 三、常见问题解决方案3.1 跨域问题处理3.2 防止服务崩溃3.3 调试技巧 四、安全最佳实践4.1 请求头安全设置4.…

SSM整合:Spring+SpringMVC+MyBatis完美融合实战指南

前言 在Java企业级开发领域,SSM(SpringSpringMVCMyBatis)框架组合一直占据着重要地位。这三个轻量级框架各司其职又相互配合,为开发者提供了高效、灵活的开发体验。本文将深入探讨SSM框架的整合过程,揭示整合背后的原…

[AI]大模型MCP快速入门及智能体执行模式介绍

[AI]大模型MCP快速入门及智能体执行模式介绍 一、MCP入门 介绍 MCP(Model Context Protocol,模型上下文协议)是一种由Anthropic公司于2024年提出的开放标准协议,旨在为大型语言模型(LLM)提供统一接口&am…

Mac M1 安装 ffmpeg

1.前言 官网那货没有准备m系列的静态包,然后我呢,不知道怎么想的就从maven项目中的 javacv-platform,且版本为1.5.11依赖里面将这个静态包把了出来,亲测能用,感觉比那些网上说的用什么wget编译安装、brew安装快多了。…

unity控制相机围绕物体旋转移动

记录一下控制相机围绕物体旋转与移动的脚本,相机操作思路分为两块,一部分为旋转,一部分为移动,旋转是根据当前center中心点的坐标,根据距离设置与默认的旋转进行位置移动,移动是根据相机的左右和前后进行计…

python打卡day38@浙大疏锦行

知识点回顾: Dataset类的__getitem__和__len__方法(本质是python的特殊方法)Dataloader类minist手写数据集的了解 作业:了解下cifar数据集,尝试获取其中一张图片 一、首先加载CIFAR数据集 import torch import torchvi…

用户配置文件(Profile)

2.4.5 用户配置文件(Profile) 用户配置文件由以下组件构成: 一个运营商安全域(MNO-SD) 辅助安全域(SSD)和CASD Applets 应用程序(如NFC应用) 网络接入应用&#xff…

如何给自研MCP加上安全验证

前言 刚过去两个月,市面的 MCP 服务,如雨后春笋一般不断涌现出来,包括;百度、高德、网盘、支付宝。这些 MCP 服务,可以让我们基于 Spring AI 框架构建的 Agent 具备非常丰富的使用功能。同时这也说明,程序员👨🏻‍💻,应该具备开发 MCP 服务的能力,Spring AI 让 J…

Unity网络开发实践项目

摘要:该网络通信系统基于Unity实现,包含以下几个核心模块: 协议配置:通过XML定义枚举(如玩家/英雄类型)、数据结构(如PlayerData)及消息协议(如PlayerMsg)&a…

OpenCV CUDA模块图像过滤------创建一个 Sobel 滤波器函数createSobelFilter()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数用于创建一个 Sobel 滤波器,用于在 GPU 上进行边缘检测。它基于图像的梯度计算: dx 表示对 x 方向求导的阶数&…

【JavaSE】枚举和注解学习笔记

枚举和注解 -枚举 规定多选一数据类型的解决方案-枚举 枚举对应英文(enumeration,简写 enum) 2)枚举是一组常量的集合。 3)可以这里理解:枚举属于一种特殊的类,里面只包含一组有限的特定的对象。 枚举的两种实现方式 自定义实现枚举 使用enum关键字实现枚举 自…

Spark SQL进阶:解锁大数据处理的新姿势

目录 一、Spark SQL,为何进阶? 二、进阶特性深剖析 2.1 窗口函数:数据洞察的新视角 2.2 高级聚合:挖掘数据深度价值 2.3 自定义函数(UDF 和 UDTF):拓展功能边界 三、性能优化实战 3.1 数…

如何利用 Conda 安装 Pytorch 教程 ?

如何利用 Conda 安装 Pytorch 教程 ? 总共分为六步走: (1)第一步:验证conda 环境是否安装好? 1) conda -V2) conda --version(2)第二步:查看现有环境 conda env list…

什么是HTTP

HTTP(HyperText Transfer Protocol)是万维网数据通信的基础协议,作为应用层协议具有以下关键特性: 客户端-服务器模型:基于请求/响应模式 无状态协议:默认不保留通信状态 可扩展性:通过首部字…

2025-05-27 学习记录--Python-模块

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、模块 ⭐️ (一)模块的导入与使用 🍭 模块的导入:🐝 模块 就好比…

leetcode 131. Palindrome Partitioning

目录 一、题目描述 二、方法1、回溯法每次暴力判断回文子串 三、方法2、动态规划回溯法 一、题目描述 分割回文子串 131. Palindrome Partitioning 二、方法1、回溯法每次暴力判断回文子串 class Solution {vector<vector<string>> res;vector<string>…

重构开发范式!飞算JavaAI革新Spring Cloud分布式系统开发

分布式系统凭借高可用性、可扩展性等核心优势&#xff0c;成为大型软件项目的标配架构。Spring Cloud作为Java生态最主流的分布式开发框架&#xff0c;虽被广泛应用于微服务架构搭建&#xff0c;但其传统开发模式却面临效率瓶颈——从服务注册中心配置到网关路由规则编写&#…

python 生成复杂表格,自动分页等功能

py&#xff54;&#xff48;&#xff4f;&#xff4e; 生成复杂表格&#xff0c;自动分页等功能 解决将Python中的树形目录数据转换为Word表格&#xff0c;并生成带有合并单元格的检测报告的问题。首先&#xff0c;要解决“tree目录数据”和“Word表格互换”&#xff0c;指将树…

根据Cortex-M3(包括STM32F1)权威指南讲解MCU内存架构与如何查看编译器生成的地址具体位置

首先我们先查看官方对于Cortex-M3预定义的存储器映射 1.存储器映射 1.1 Cortex-M3架构的存储器结构 内部私有外设总线&#xff1a;即AHB总线&#xff0c;包括NVIC中断&#xff0c;ITM硬件调试&#xff0c;FPB, DWT。 外部私有外设总线&#xff1a;即APB总线&#xff0c;用于…