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

机器学习:KNN 算法详解

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

魔尊发布于 2026/3/28更新于 2026/9/268 浏览
机器学习: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. 适用场景

更多推荐文章

查看全部
  • Jenkins 在 Linux 及 Docker 环境下的安装配置
  • JDK 安装与环境配置详解
  • 关于人工智能与人类边界:一场深度哲学对话
  • JDK8 升级至 JDK21 与 Spring Cloud 版本迁移
  • 基于 Docker 部署节点小宝实现 SD-WAN 远程开发
  • JDK21 集成 IntelliJ IDEA 开发环境详解
  • 宇树 G1 机器人开发:有线与无线连接配置指南
  • JDK21 虚拟线程:从平台线程到轻量级并发
  • C# 与 Python 在 AI 模型路由中的性能对比与选型指南
  • Python 缠论分析:自动化买卖点识别与策略优化
  • MCP 协议详解:与 Function Call 的区别及使用方法
  • JDK 安装与环境配置实战指南
  • JDK 1.8 (8u202) 下载与安装配置指南
  • Web 前端开发入门准备指南:思维、心态与知识体系
  • 机器人脑部药物递送三大技术路径的可转化性分析
  • 前端日期格式化:Intl.DateTimeFormat 详解与替代方案
  • JDK 17 安装与环境配置详解
  • Java Map 与 Set 数据结构及实现原理
  • JDK 17 官方下载与跨平台安装指南
  • Tesseract.js 纯 JavaScript OCR 技术指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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