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

推荐订阅源

GbyAI
GbyAI
N
News and Events Feed by Topic
D
DataBreaches.Net
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Engineering at Meta
Engineering at Meta
T
Tailwind CSS Blog
博客园_首页
Microsoft Azure Blog
Microsoft Azure Blog
Y
Y Combinator Blog
博客园 - Franky
Hugging Face - Blog
Hugging Face - Blog
月光博客
月光博客
A
About on SuperTechFans
I
InfoQ
S
Securelist
Last Week in AI
Last Week in AI
S
Schneier on Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
Hacker News: Ask HN
Hacker News: Ask HN
Schneier on Security
Schneier on Security
Know Your Adversary
Know Your Adversary
腾讯CDC
大猫的无限游戏
大猫的无限游戏
S
Security @ Cisco Blogs
博客园 - 三生石上(FineUI控件)
Simon Willison's Weblog
Simon Willison's Weblog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Tor Project blog
美团技术团队
aimingoo的专栏
aimingoo的专栏
G
Google Developers Blog
罗磊的独立博客
Vercel News
Vercel News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Cloudflare Blog
S
Secure Thoughts
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Latest news
Latest news
Recent Announcements
Recent Announcements
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
L
LINUX DO - 热门话题
Security Latest
Security Latest
TaoSecurity Blog
TaoSecurity Blog
Cyberwarzone
Cyberwarzone
有赞技术团队
有赞技术团队

博客园 - 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 值、根据问题选择合适的距离度量。它常作为复杂问题的第一个基线模型,帮你快速建立对问题的认知。