当前位置: 首页 > news >正文

K 近邻算法(KNN)完整解析:原理 + 数学公式 + 实战

1️⃣ 什么是 KNN?

KNN(K-Nearest Neighbors,K 近邻算法)是一种经典的监督学习算法,可用于分类和回归。

核心思想:

对一个未知样本,找到训练集中距离它最近的 K 个邻居,通过“多数投票”或“加权平均”来预测类别或数值。

KNN 属于基于实例的学习(Instance-based Learning),也称为“懒惰学习”(Lazy Learning):

  • 没有显式训练过程

  • 预测时直接用整个训练集计算最近邻

2️⃣ 核心思想与流程

KNN 算法步骤:

  1. 给定参数 K 和距离度量方式

  2. 对未知样本 x,计算它与训练集中所有样本的距离

  3. 找出距离最近的 K 个样本

  4. 分类任务:按多数类别投票

  5. 回归任务:按平均值或加权平均预测

3️⃣ 数学公式

3.1 距离度量

常用的欧式距离:

d(x_i, x_j) = \sqrt{\sum_{k=1}^n (x_i^{(k)} - x_j^{(k)})^2} 

其他距离度量:

3.2 分类任务:投票规则

\hat{y} = \arg\max_{c \in \mathcal{C}} \sum_{i=1}^K w_i \cdot \mathbb{I}(y_i = c)

  • 曼哈顿距离

  • 闵可夫斯基距离

  • 余弦相似度(适合文本向量)

  • \mathbb{I}(y_i = c):样本 i 是否属于类别 c

  • w_i​:权重,可设为 1/d(x, x_i)

3.3 回归任务:加权平均

\hat{y} = \frac{\sum_{i=1}^K w_i y_i}{\sum_{i=1}^K w_i}

4️⃣ 超参数 K 的选择

  • K 太小:模型复杂度高,容易过拟合

  • K 太大:模型过于平滑,容易欠拟合

常用交叉验证选择最优 K 值。
一般经验:K = sqrt(n)(n 为样本数)是一个参考值。

5️⃣ 优缺点总结

✅ 优点

  1. 理论简单,易于理解

  2. 适用于多分类问题

  3. 无需显式训练,天然支持增量数据

❌ 缺点

  1. 计算量大,预测速度慢(需计算所有距离)

  2. 对特征尺度敏感,需要标准化/归一化

  3. 对噪声和离群点敏感

  4. 高维数据效果差(维度灾难)

6️⃣ Python 实现(sklearn)

分类任务

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score# 加载数据
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 构建 KNN 模型
knn = KNeighborsClassifier(n_neighbors=5, metric='minkowski')
knn.fit(X_train, y_train)# 预测与评估
y_pred = knn.predict(X_test)
print("测试集精度:", accuracy_score(y_test, y_pred))

回归任务 

from sklearn.neighbors import KNeighborsRegressorknn_reg = KNeighborsRegressor(n_neighbors=5, weights='distance')
knn_reg.fit(X_train, y_train)
y_pred = knn_reg.predict(X_test)

7️⃣ 应用场景

  • 基础分类任务(如 Iris 数据集)

  • 图像识别(小规模数据)

  • 推荐系统(基于相似度)

  • 文本相似度搜索

📚 总结

  • KNN 是懒惰学习,核心是距离度量 + 投票/加权平均

  • 适合小数据集,计算量可控时效果好

  • 大规模数据需结合 KD 树、Ball 树或近似近邻算法(如 FAISS)优化

 

http://www.dtcms.com/a/314621.html

相关文章:

  • 在Windows 11+I7+32GB内存+RTX 3060上部署Stable Diffusion 3.5 Medium详细步骤
  • Django + Vue 项目部署(1panel + openresty)
  • 制造业引入设备管理系统,实现智能资产运维与效率飞跃
  • Node.js(四)之数据库与身份认证
  • Nestjs框架: Node.js 多环境配置策略与 dotenv 与 config 库详解
  • 【计算机网络 | 第2篇】计算机网络概述(下)
  • Go 语言模糊测试 (Fuzz Testing) 深度解析与实践
  • Onnx模型部署到Arm64进行推理
  • MAC-Spring Cloud + Spring Boot + RocketMQ集成
  • 「查漏补缺」ZGC相关内容整理
  • 机器学习(13):逻辑回归
  • 一周学会Matplotlib3 Python 数据可视化-Hello World编写
  • 半同步复制原理
  • 企业级库存穿透技术实现:基于LSTM的实时损耗控制算法在快鹭AI办公系统中的实践
  • Jmeter进行性能并发测试
  • mybatis知识
  • 网安学习NO.21
  • 飞算JavaAI需求转SpringBoot项目沉浸式体验
  • 探访WAIC2025:当AI成为双刃剑,合合信息如何破解真假难题
  • 北京JAVA基础面试30天打卡01
  • SpringMvc跨域配置方法详解
  • Linux网络编程【基于UDP网络通信的群聊服务】
  • 通用代码自用
  • 李沐写作笔记
  • C语言结构体、位段、枚举、联合体
  • Codeforces Round 1004 (Div. 2)
  • win10 系统,一键保存截图, shift + print_screen
  • Ubuntu 下 MySQL 运维自动化部署教程(在线简易版)
  • 0.08B参数以小博大:用小模型生成媲美GPT-4o的古典诗词
  • TCP 四次挥手详解