跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

机器学习:KNN 算法详解

KNN 是一种监督学习算法,核心思想基于样本间距离找出 K 个最近邻进行分类或回归预测。K 值选择影响模型泛化能力,过小易过拟合,过大易欠拟合。常用距离度量包括欧氏、曼哈顿、切比雪夫及闵可夫斯基距离。特征预处理如归一化和标准化用于消除量纲差异,提升模型效果。KNN 优点是原理简单无需显式训练,缺点是预测效率低且对高维数据敏感。

魔尊发布于 2026/3/28更新于 2026/7/1947 浏览
机器学习:KNN 算法详解

一、KNN 算法核心思想

K - 近邻算法(K Nearest Neighbor,简称 KNN)是一种简单且经典的监督学习算法,核心思想可以概括为:'近朱者赤,近墨者黑'。

KNN(K Nearest Neighbors)是一种惰性学习(lazy learning)算法,因为它不会对训练数据进行显式的学习或建模,只是把训练数据存储起来,直到测试阶段才进行计算,通过计算未知样本与训练集中所有样本的"距离",找出最相似的 K 个邻居,根据这些邻居的类别来决定未知样本的类别。

KNN 不仅适用于分类问题,也可用于回归问题,两者的处理流程相似但目标不同:

任务类型核心目标决策规则适用场景举例
分类预测离散的类别标签统计 K 个近邻中占比最高的类别鸢尾花分类、手写数字识别
回归预测连续的数值结果计算 K 个近邻目标值的算术平均值房价预测、销量预测
核心问题:如何衡量'相似性'?

样本的相似性通过距离来衡量,距离越近则相似度越高,KNN 中最常用的是欧氏距离,后续会详细介绍多种距离度量方式。

二、K 值的选择:影响模型性能的关键

K 值是 KNN 算法中最重要的超参数,其选择直接影响模型效果:

  • K 值过小:模型容易过拟合,对噪声数据敏感,泛化能力差;
  • K 值过大:模型趋于'平均化',距离较远的样本也会影响预测结果,导致欠拟合;
  • 经验选择:通常从 K=5 开始尝试,结合交叉验证选择最优值。

三、KNN 的两种应用场景 & SKlearn API

3.1 分类问题(核心:多数表决)

处理流程:

  1. 计算未知样本到每一个训练样本的距离;
  2. 将训练样本按距离升序排列;
  3. 选取距离最近的 K 个训练样本;
  4. 统计 K 个样本中各类别数量,进行多数表决;
  5. 未知样本归属到数量最多的类别。

SKlearn API:

from sklearn.neighbors import KNeighborsClassifier # 完整参数示例(含核心参数说明)
knn_clf = KNeighborsClassifier(
    n_neighbors=5, # 核心:选取的邻居数量,默认 5
    weights='uniform', # 权重方式:'uniform'(等权重)/'distance'(距离越近权重越高)
    algorithm='auto', # 近邻搜索算法:'auto'/'ball_tree'/'kd_tree'/'brute'
    p=2, # 闵可夫斯基距离的 p 值:p=1(曼哈顿)/p=2(欧式)/p→∞(切比雪夫)
    metric='minkowski' # 距离度量方式:默认'minkowski',可指定'euclidean'/'manhattan'等
)
3.2 回归问题(核心:均值预测)

处理流程:

  1. 计算未知样本到每一个训练样本的距离;
  2. 将训练样本按距离升序排列;
  3. 选取距离最近的 K 个训练样本;
  4. 计算这 K 个样本目标值的平均值;
  5. 该平均值作为未知样本的预测值。

SKlearn API:

from sklearn.neighbors import KNeighborsRegressor # 完整参数示例(含核心参数说明)
knn_reg = KNeighborsRegressor(
    n_neighbors=5, # 核心:选取的邻居数量,默认 5
    weights='uniform', # 权重方式:'uniform'(等权重平均)/'distance'(加权平均)
    algorithm='auto', # 近邻搜索算法:同分类器,auto 为推荐值
    p=2, # 距离 p 值:p=2 对应欧式距离(默认)
    metric='minkowski' # 距离度量:默认闵可夫斯基,兼容多种距离
)

四、距离度量方法

4.1 欧氏距离(最常用)

文章配图

数学定义

欧式距离是两点之间的直线距离,公式如下:

文章配图

欧式距离是两适用于连续型特征,是 KNN 默认的距离度量方式。

4.2 曼哈顿距离

文章配图

也叫'城市街区距离',计算两点在各维度上的绝对差之和:适用于特征维度具有'正交性'的场景(如路径规划)。公式如下

文章配图

适用于特征维度具有'正交性'的场景(如路径规划)。

4.3 切比雪夫距离

文章配图

取各维度绝对差的最大值适用于'棋盘距离'类场景(如国际象棋国王移动)。

公式如下:

文章配图

4.4 闵可夫斯基距离

文章配图

是欧氏距离、曼哈顿距离、切比雪夫距离的通用形式:

  • 当 p=2 时,退化为欧氏距离;
  • 当 p=1 时,退化为曼哈顿距离;
  • 当 p→∞时,退化为切比雪夫距离。

五、特征预处理:让模型更'公平'

5.1 为什么需要预处理?

特征的单位 / 大小差异过大(如'身高(cm)'和'收入(元)'),会导致距离计算被数值大的特征支配,模型无法学习到其他特征的贡献。

5.2 归一化(Min-Max Scaling)

将数据映射到 [0,1] 区间(可自定义范围),公式:

文章配图

SKlearn 实现:

from sklearn.preprocessing import MinMaxScaler # 初始化归一化器
scaler = MinMaxScaler(feature_range=(0,1)) # 拟合并转换数据
data_scaled = scaler.fit_transform(data) 

⚠️ 缺点:易受异常值影响,鲁棒性差,适合小样本、无异常值场景。

归一化实操案例(房价特征处理)
import numpy as np 
from sklearn.preprocessing import MinMaxScaler 
# 模拟房价特征数据:[面积 (㎡), 总价 (万元), 楼层]
house_data = np.array([
    [80, 200, 5], 
    [100, 300, 10], 
    [120, 400, 15], 
    [90, 250, 8] 
]) 
# 1. 初始化归一化器(默认映射到 [0,1])
scaler = MinMaxScaler(feature_range=(0, 1)) 
# 2. 拟合并转换数据
house_scaled = scaler.fit_transform(house_data) 
print("原始数据:")
print(house_data) 
print("\n归一化后数据:")
print(house_scaled) 
print("\n各特征最小值:", scaler.data_min_) 
print("各特征最大值:", scaler.data_max_)

输出结果:

原始数据: [[ 80 200 5] [100 300 10] [120 400 15] [ 90 250 8]] 归一化后数据: [[0. 0. 0. ] [0.5 0.5 0.5 ] [1. 1. 1. ] [0.25 0.25 0.3 ]] 各特征最小值: [ 80. 200. 5.] 各特征最大值: [120. 400. 15.]
5.3 标准化(Standard Scaling)

将数据转换为均值为 0,标准差为 1的标准正态分布,公式:

SKlearn 实现:

from sklearn.preprocessing import StandardScaler 
scaler = StandardScaler() 
data_scaled = scaler.fit_transform(data) 

✅ 优点:受异常值影响小,适用于大数据集、有异常值的场景,是 KNN 的首选预处理方式。

标准化实操案例(学生成绩处理)
import numpy as np 
from sklearn.preprocessing import StandardScaler 
# 模拟学生成绩数据:[数学,英语,语文](含异常值:最后一行是满分异常)
score_data = np.array([
    [60, 70, 80], 
    [75, 85, 90], 
    [80, 82, 78], 
    [90, 88, 92], 
    [100, 100, 100] # 异常值
]) 
# 1. 初始化标准化器
scaler = StandardScaler() 
# 2. 拟合并转换数据
score_scaled = scaler.fit_transform(score_data) 
print("原始数据:")
print(score_data) 
print("\n标准化后数据:")
print(np.round(score_scaled, 2)) # 保留 2 位小数
print("\n各特征均值:", np.round(scaler.mean_, 2)) 
print("各特征标准差:", np.round(scaler.scale_, 2))

输出结果:

原始数据: [[ 60 70 80] [ 75 85 90] [ 80 82 78] [ 90 88 92] [100 100 100]] 标准化后数据: [[-1.47 -1.53 -0.8 ] [-0.45 0.21 0.2 ] [-0.12 -0.12 -1.01] [ 0.51 0.54 0.41] [ 1.53 0.9 1.2 ]] 各特征均值: [81. 85. 88. ] 各特征标准差: [14.25 9.83 10.02]

六、KNN 算法总结

优点
  1. 原理简单,易于理解和实现;
  2. 无需训练过程(惰性学习),新增样本后可直接使用;
  3. 既适用于分类也适用于回归;
  4. 对异常值不敏感(结合标准化)。
缺点
  1. 预测效率低(需计算与所有训练样本的距离),大数据集下速度慢;
  2. 对高维数据不友好(维度灾难);
  3. 对距离度量方式和 K 值选择敏感;
  4. 样本不平衡时,少数类易被忽略。
适用场景

小样本、低维度、数据分布均匀的分类 / 回归问题(如推荐系统、简单图像识别)。

目录

  1. 一、KNN 算法核心思想
  2. 核心问题:如何衡量“相似性”?
  3. 二、K 值的选择:影响模型性能的关键
  4. 三、KNN 的两种应用场景 & SKlearn API
  5. 3.1 分类问题(核心:多数表决)
  6. 3.2 回归问题(核心:均值预测)
  7. 四、距离度量方法
  8. 4.1 欧氏距离(最常用)
  9. 数学定义
  10. 4.2 曼哈顿距离
  11. 4.3 切比雪夫距离
  12. 4.4 闵可夫斯基距离
  13. 五、特征预处理:让模型更“公平”
  14. 5.1 为什么需要预处理?
  15. 5.2 归一化(Min-Max Scaling)
  16. 归一化实操案例(房价特征处理)
  17. 模拟房价特征数据:[面积 (㎡), 总价 (万元), 楼层]
  18. 1. 初始化归一化器(默认映射到 [0,1])
  19. 2. 拟合并转换数据
  20. 5.3 标准化(Standard Scaling)
  21. 标准化实操案例(学生成绩处理)
  22. 模拟学生成绩数据:[数学,英语,语文](含异常值:最后一行是满分异常)
  23. 1. 初始化标准化器
  24. 2. 拟合并转换数据
  25. 六、KNN 算法总结
  26. 优点
  27. 缺点
  28. 适用场景
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • VSCode Copilot 接入智谱 GLM-5.1 实现自定义大模型配置
  • Ubuntu 本地部署 OpenClaw:接入 Ollama 推理与飞书通道
  • 海外程序员接单平台推荐:Freelancer、Upwork、Fiverr 与 Toptal 详解
  • 2026 AI 编码工具深度对比:Claude Code、Cursor 与 GitHub Copilot 选型指南
  • Java 图书管理系统设计与实现
  • 用老 Mac 跑本地 AI:OpenClaw 环境一键搭建
  • Windows 11 环境下通过命令行升级 Python 版本的方法
  • 荣耀 MWC 2026 展示人形机器人,手机厂商布局具身智能
  • 西门子S7-1200 PLC与爱普生机器人Modbus TCP通讯配置
  • AI 大模型开发入门:使用 OpenAI API 实现 Hello World
  • 中小团队基于 Ubuntu 的 DooTask 项目管理系统私有化部署实战
  • Llama 2 ONNX 模型快速部署指南
  • 最新最全机器人顶会“灵巧手”(dexterous hand)论文集合
  • Stable Diffusion 本地部署与基础使用指南
  • 秋叶绘世 Stable Diffusion 整合包技术解析与使用指南
  • VS Code + WSL 下 GitHub 访问与 Copilot 连接问题解决方案
  • 流处理与 RAG 驱动的 Python ETL 框架架构设计
  • 零门槛上手!小白也能封神,好用的AI写作平台
  • 基于Coze平台搭建AI客服机器人的全流程指南
  • DFT 中的 On-Chip Clock Controller (OCC) 架构设计与插入规则

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online