惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

有赞技术团队
有赞技术团队
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
P
Palo Alto Networks Blog
C
Cisco Blogs
The Hacker News
The Hacker News
T
Threatpost
S
Schneier on Security
K
Kaspersky official blog
Spread Privacy
Spread Privacy
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
NISL@THU
NISL@THU
量子位
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Google DeepMind News
Google DeepMind News
Security Latest
Security Latest
博客园 - 司徒正美
云风的 BLOG
云风的 BLOG
博客园 - 叶小钗
H
Hackread – Cybersecurity News, Data Breaches, AI and More
N
News and Events Feed by Topic
爱范儿
爱范儿
P
Proofpoint News Feed
C
CERT Recently Published Vulnerability Notes
Project Zero
Project Zero
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Cisco Talos Blog
Cisco Talos Blog
GbyAI
GbyAI
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Apple Machine Learning Research
Apple Machine Learning Research
T
Tenable Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
V
Vulnerabilities – Threatpost
Forbes - Security
Forbes - Security
博客园 - 三生石上(FineUI控件)
C
Cyber Attacks, Cyber Crime and Cyber Security
N
News and Events Feed by Topic
V
V2EX
Webroot Blog
Webroot Blog
The Register - Security
The Register - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Blog — PlanetScale
Blog — PlanetScale
M
MIT News - Artificial intelligence
Scott Helme
Scott Helme
Simon Willison's Weblog
Simon Willison's Weblog
L
LangChain Blog
W
WeLiveSecurity
Cloudbric
Cloudbric

博客园 - ace--碳水化合物

English1 Tidio 官方帮助中心 ERP 相关系统介绍 蝉翼定理 选配法 利润最大化公式 写在失业的一段话 排列组合-组合 在线简历 概率论与数理统计学习章节 绝对值 比例五大定理 算术平均值与几何平均值 等价符号 公因数与最大公因数 容斥原理 英语2026 机器学习,深度学习,强化学习 分别是什么以及区别是什么 深度学习 监督学习 FAQ IVR TTS选择 kaldi 平稳核函数(stationary kernel) Karush-Kuhn-Tucker 条件 凸二次规划(convex quadratic programming) FunASR+FreeSwitch做坐席客服系统记录 freeswitch原理图 客服系统,第三方平台,对话转录音,这些可以不依赖第三方做么 STUN服务器 Gun.js原理 游戏升级记 10 OBB 边界问题 关于yolo26是否可以通过结合java开发 opencv和yolo是一回事情吗 pytorch TorchVision - ace--碳水化合物 PyTorch 和 FashionMNIST 的关系 java record 游戏升级记 9 VibeVoice实现90分钟、多角色播客生成,拓展语音合成新边界 同 WiFi 下用 Claude Code 控制另一台 Windows 电脑 Numpy 1 游戏升级记 8 开源claudecode前端 github star 9k+ 向量数据库skill 游戏升级记 7 游戏升级记 6 关系型数据库,向量数据库,ES,缓存,列式数据库,时序数据库,图数据库等的区别和共同点列举table 多Agent可视化 Agent设计模式 中文 Hermes+Obsidian+LLM wkii,构建AI知识库 Claude Code 前端工程泄露代码开源 游戏升级记 5 ai记忆 Rag 1 游戏升级记 4 游戏升级记 3 游戏升级记 2 AI学习路线 关于hermes agent安装 1 游戏升级记 1 代码迷踪 十三 代码迷踪 十二 ai智能体工程 Rust vs Go 微信小程序实名认证 怎样制作一个街机游戏 跟Claude code说 深入思考 它会思考更深入. googlebusiness profile设置统一白名单的操作,要弹窗模式的 该怎样利用ollama自己训练一个编程大模型 中华AI智能体编程一站式基站构想 打包网站到exe和app 识别的内容一般是试题模板的题号和手写的答题答案(数字) opencv怎么训练 在线SaaS系统做接口版本滚动更新 stripe相关支付流程 流程示意图 error: linker `link.exe` not found | = note: program not found - rust 给我一份关于stripe平台的使用开发说明 c++学习记20260219 奥数-平面几何经典定理 奥数-组合数学 奥数-几何 奥数-代数 奥数-数论
k 近邻算法
ace--碳水化合物 · 2026-05-28 · via 博客园 - ace--碳水化合物

我们来系统性地讲解 k 近邻算法(k-Nearest Neighbors, KNN)。我会从直观理解、核心原理、关键细节、代码示例到优缺点,层层递进。


一、直观理解:近朱者赤,近墨者黑

KNN 可能是机器学习中最简单、最直观的算法。它的核心思想只有一句话:

要判断一个新样本的类别或数值,就去看它在训练数据中最相似的 k 个邻居是谁,然后让这些邻居投票决定。

  • 分类问题:少数服从多数
  • 回归问题:取邻居的平均值

它不需要显式的训练过程,属于惰性学习算法——所有计算都推迟到预测时进行。


二、算法原理

以分类问题为例:

  1. 选择 k 值:确定要考虑的邻居数量
  2. 计算距离:计算新样本与所有训练样本的距离
  3. 找邻居:选出距离最近的 k 个样本
  4. 投票决策:统计这 k 个邻居的类别,把新样本归为出现次数最多的类别
  5. (回归)求均值:回归问题则计算 k 个邻居目标值的平均数

常用距离度量

  • 欧氏距离(最常用):适用于连续特征

    \[d = \sqrt{\sum_{i=1}^{n}(x_i - y_i)^2} \]

  • 曼哈顿距离:适用于高维或网格状数据

    \[d = \sum_{i=1}^{n}|x_i - y_i| \]

  • 闵可夫斯基距离:欧氏和曼哈顿的泛化形式
  • 余弦相似度:常用于文本、高维稀疏数据

三、关键参数与核心问题

1. k 值的选择——算法成败的关键

  • k 太小(如 k=1):对噪声异常敏感,容易过拟合,决策边界崎岖
  • k 太大(如 k=N):模型过于平滑,失去对细节的捕捉能力,容易欠拟合
  • 经验做法:通常选奇数(避免投票平局),通过交叉验证在 [1, 30] 范围内寻找最优值

2. 距离的尺度陷阱

如果特征量纲不一致(如“收入”用元、“年龄”用岁),量级大的特征会主导距离计算。

必须做的事:标准化(Z-score)或归一化(Min-Max),让所有特征在相同尺度上。

3. 决策规则的变体

  • 距离加权投票:让离得近的邻居权重更大(如权重 = 1/distance),这是最常见的改进
  • 解决平局:减小 k 值、增加 k 值或使用距离加权

4. 计算复杂度

  • 预测时间复杂度:O(N × D),N 为训练样本数,D 为特征维度
  • 这是 KNN 的主要瓶颈,面对大规模数据需要 KD-Tree、Ball-Tree 等索引结构加速

四、Python 实现(从零手写 + sklearn 实战)

手写 KNN 分类器

import numpy as np
from collections import Counter

class KNNClassifier:
    def __init__(self, k=3, distance='euclidean'):
        self.k = k
        self.distance = distance
    
    def fit(self, X, y):
        self.X_train = X
        self.y_train = y
    
    def predict(self, X):
        return np.array([self._predict_one(x) for x in X])
    
    def _predict_one(self, x):
        # 计算所有距离
        if self.distance == 'euclidean':
            distances = np.sqrt(np.sum((self.X_train - x) ** 2, axis=1))
        elif self.distance == 'manhattan':
            distances = np.sum(np.abs(self.X_train - x), axis=1)
        
        # 获取 k 个最近邻居的索引
        k_indices = np.argsort(distances)[:self.k]
        k_labels = self.y_train[k_indices]
        
        # 多数投票
        most_common = Counter(k_labels).most_common(1)
        return most_common[0][0]

sklearn 实战(带数据预处理)

from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.datasets import load_iris

# 加载数据
iris = load_iris()
X, y = iris.data, iris.target

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 关键步骤:标准化!
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# 寻找最优 k 值
best_k, best_score = 0, 0
for k in range(1, 31):
    knn = KNeighborsClassifier(n_neighbors=k)
    scores = cross_val_score(knn, X_train_scaled, y_train, cv=5)
    if scores.mean() > best_score:
        best_k, best_score = k, scores.mean()

print(f"最优 k 值: {best_k}, 交叉验证准确率: {best_score:.3f}")

# 训练最终模型
final_knn = KNeighborsClassifier(n_neighbors=best_k, weights='distance')
final_knn.fit(X_train_scaled, y_train)
print(f"测试集准确率: {final_knn.score(X_test_scaled, y_test):.3f}")

五、优缺点与应用场景

优点 缺点
简单直观,无需训练 预测慢,计算量大
没有假设数据分布 需存储全部训练数据
多分类问题天然支持 对高维数据效果差(维度灾难)
新数据加入容易 对不平衡数据敏感
只有一个超参数 k 缺失值处理麻烦

典型应用场景

  • 推荐系统:找相似用户/物品
  • 小规模图像分类:手写数字识别(MNIST 入门)
  • 异常检测:远离邻居的点可能是异常
  • 缺失值填补:用近邻的均值或众数填补
  • 快速基线模型:评估问题难度

六、进阶优化方向

  1. 加速技术:KD-Tree、Ball-Tree、LSH(局部敏感哈希)—— sklearn 中设置 algorithm='ball_tree' 即可
  2. 降维配合:先用 PCA 等降维,缓解维度灾难
  3. 度量学习:学习最优的距离度量矩阵(如 NCA、LMNN)
  4. 大数据变体:使用近似最近邻算法,牺牲少量精度换取巨大速度提升

总结

KNN 是“理解成本极低,但用好需要细致处理”的典型算法。关键三件事:标准化特征、精心选择 k 值、根据问题选择合适的距离度量。它常作为复杂问题的第一个基线模型,帮你快速建立对问题的认知。