附赠演示 · K 近邻分类

KNN 分类:近朱者赤的机器版

最「懒」也最直觉的分类器:150 条真实的鸢尾花测量记录(UCI 数据集,三类各 50 条),预测新花时才翻出全部数据,量出标准化空间里最近的 K 位邻居,投票定类——没有训练环节,是「惰性学习」的代表作。拖动滑块量一朵新花,再用留一法给 8 个 K 值现场打分。

花瓣长 × 花瓣宽 投影

散点仅展示花瓣长 × 花瓣宽两个维度;预测实际使用全部四个特征(z-score 标准化后的欧氏距离)。空心圆圈是你拖出来的新样本。

留一法交叉验证准确率(点击格子切换 K)

量一朵新花

拖到极端值试试:花瓣长宽拉到最小,预测会稳稳落在一类;拉到最大则是另一类。

当前 K7
留一法准确率—
训练样本150 条
特征维度4 维

预测结果

—
  • 拖动右侧滑块,投票结果会出现在这里。

最近的 5 位邻居(标准化空间距离)

  • 等待预测—

原理:距离、投票与标准化

K 近邻没有「训练」环节:预测时才翻出全部 150 条记录,量出新样本到每条记录的距离,取最近的 K 条投票。距离用标准化后的欧氏距离:

z = (x − μ) / σ  ,  d(a, b) = √ Σⱼ (aⱼ − bⱼ)²

K:模型的「性格」旋钮

  • K=1:完全跟随单条最近记录,决策区域碎成小块、对噪声零抵抗——低偏差、高方差的过拟合脸。
  • K 大:投票人多、边界平滑、抗噪强,但太大会把隔壁类也圈进来——高偏差的欠拟合脸。点上面的 K 格子,从 1 扫到 15,留一法准确率就是一条「先升后稳/降」的曲线。
  • 经验值:K 取小奇数(避免平票),常用 √n 附近起步再用交叉验证定——本页的 K 格子就是现成的验证器。

距离是它的整个世界观

  • 标准化不是可选项。原始数据里花瓣长度范围约 1–7 cm、花萼宽度 2–4.5 cm,不标准化的话欧氏距离几乎被花瓣长度垄断——「最近邻」变成「花瓣长最像」。z-score 让四个特征公平投票。
  • 换距离 = 换假设。欧氏最常用;曼哈顿对高维更稳;余弦相似度只看方向不看大小(文本向量标配); categorical 特征要换汉明距离。距离选错,邻居就「不近」。
  • 加权投票是免费升级。距离越近话语权越大(1/d 或 exp(−d²)),边界更平滑、K 大些也不糊——本页用多数投票,加权版可作为课后扩展。

留一法(LOO):数据少时的严格考官

每次留出 1 条当考题、其余 149 条当题库,遍历 150 次——每条数据都恰好被考一次,150 次平均就是最「榨干数据」的交叉验证。8 个候选 K 共 1200 次评估,全部由浏览器现场完成。数据多时 LOO 太贵(要训 n 次),改用 5/10 折;数据少时 LOO 几乎免费(KNN 无训练,只算距离)。

维数灾难:KNN 的天敌

维度上百时,「最近」失去意义:高维球壳里所有点距离趋于相同(距离集中现象),邻居不再「近」。对策:先 PCA 降维再 KNN、特征选择、或换基于树/核的模型。本页只有 4 维所以一切正常——把特征想象成 200 维,就能体会 KNN 的天花板。

工程备注:暴力 KNN 每次预测要算 n 个距离,数据大会慢;KD 树 / 球树索引能把查询摊还到 O(log n),但在高维又退化——「索引 acceleration 在高维失效」和维数灾难是同一件事。

知识点拆解:把 KNN 学扎实

范式

惰性学习 vs 急切学习

KNN 把计算从训练期挪到预测期(无训练、预测贵);Logistic 等急切模型相反。查询频繁、数据海量的线上服务里,「预测快」往往比「训练快」重要——这就是 KNN 不上线的理由。

对应演示:预测需遍历 150 条
决策区域

Voronoi 镶嵌

K=1 时决策区域是每个训练点势力范围的 Voronoi 图,边界全由点到点的垂直平分线构成;K 增大区域合并、变圆滑。看一眼 K 格子切换时边界的变化就懂。

关键词:Voronoi 图
预处理

z-score 是距离模型的命根

所有基于距离的模型(KNN、K-Means、SVM-RBF、PCA)都要先标准化——它们共享同一个软肋:原始尺度大的特征霸占距离/方差。这一条是四页连考的通用考点。

对应演示:不加标准化→花瓣长独裁
回归版

KNN 也能做回归

把「投票」换成「K 个邻居预测值取平均」(或距离加权平均),KNN 就是回归器。没有参数拟合、边界完全由数据形状决定——惰性哲学在回归里同样成立。

关键词:距离加权平均
  • 惰性学习 — 不训练,预测时才查表
  • 欧氏距离 — 直线距离,最常用度量
  • z-score 标准化 — (x−μ)/σ,公平量纲
  • 多数投票 — K 邻居中类别多者胜
  • 留一法 LOO — 每条轮流当测试集
  • 维数灾难 — 高维下距离失去区分度

期末高频问答

  • K=1 时训练集准确率是多少?留一法呢?训练集准确率 100%(每个点最近邻是自己);但留一法会把它自己排除,考的是泛化——两个数字的差正是「过拟合程度」的直观度量。
  • 为什么 K 常取奇数?二分类时避免平票。多分类即使奇数也可能三方平票——本页规则:取平票类别中「邻居距离总和」更小的一方。
  • KNN 有「损失函数」吗?没有显式损失、没有优化过程——这是它与「训练类模型」的本质区别。它的「模型」就是训练集本身,所有智能都藏在距离定义和 K 里。