Jikipedia
第 38 篇

一只兔子帮你理解 kNN

量化课堂第 38 篇(postId=2227,作者肖睿,编辑宏观经济算命师,难度进阶上、理解深度 level-1,2016-08-16 上线,v1.1 加研究模块、v1.2 于 2016-09-14 修正公式)。机器学习组第 3 篇,也是 kNN 家族(38–41)的第一篇。全篇用「三种兔子」的寓言讲 kNN 分类:找离目标最近的 k 个已知样本投票;顺手把距离函数、特征归一化、概率 kNN、k 的偏差-方差权衡都讲了。结语点出 kNN 的计算量问题,预告 kd 树(第 39 篇)。素材见 raw/collections/jq-quant-classroom/38-38-一只兔子帮你理解knnmd.md。

量化kNN最近邻距离函数归一化分类

这是什么

一篇几乎不写代码的寓言式算法入门。开头引商业哲学家 Jim Rohn:「你,就是你最常接触的五个人的平均」——分析一个人就看他最亲密的几个人;判断未知事物就观察离它最近的几个样本,这就是 kNN(k 最近邻)。正文用机器人识别三种危险兔子的故事,把「特征」「标签」「k 值」「距离函数」「归一化」「概率 kNN」逐个讲明白,并坦诚 kNN「思路简单但实现起来计算量大」。

核心要点

kNN 定义与兔子故事

  • 三种兔子数据:悲伤 Grief(平均身高 50cm、体重 5kg)、痛苦 Agony(30cm、4kg)、绝望 Despair(45cm、2.5kg),每种 100 只。(身高,体重)=特征(features),品种=分类标签(class label)。机器人经费不足,只会测身高体重。
  • 迷之兔子实测:身长 40cm、体重 2.7kg。k=15 → 判绝望;k=1 → 判痛苦(因为离它最近的是痛苦的蓝三角)。
  • k 的影响:1NN 分类边界明显更「崎岖」,但对历史样本零误判;15NN 边界更平滑,却会对历史样本误判。选择 k 是对偏差和方差的权衡——本文不深讲,原文让读者「凭感觉选一个 k」。

距离函数

  • 空间上距离的严格定义需满足四条公理:非负;d(x,y)=0 当且仅当 x=y;对称;三角不等式 d(x,z)≤d(x,y)+d(y,z)。
  • 最常用的欧氏距离 = L₂:d₂(x,y)=√(Σ(xᵢ−yᵢ)²)。它是更一般的 Lₚ 距离在 p=2 的特例:dₚ(x,y)=(Σ|xᵢ−yᵢ|ᵖ)^{1/p}。
  • L∞ 距离 = max|xᵢ−yᵢ|。实际应用默认用 L₂;距离函数的选择应随数据特性而定(本文点到为止)。

归一化(量纲)——关键坑

  • 兔子的身高(cm)数值约是体重(kg)的 10 倍;直接在这组数值上用 L₂,横轴(身高)距离被放大,分类结果不合理。
  • 换单位会得出完全不同结果:极端情况身高用纳米、体重用吨,距离几乎全由身高决定,体重没有任何权重。
  • 解法:每根轴除以它的取值范围 Mⱼ = max−min,再算距离 d=√(Σ(yⱼ/Mⱼ−zⱼ/Mⱼ)²)。这就是把坐标轴拉到同一尺度(min-max 缩放)。

概率 kNN

  • 有时不想要绝对分类,而想知道「属于每类的概率」。37cm/4.8kg 的小兔兔在悲伤/痛苦分界处:最近 15 个样本里 8 只悲伤、7 只痛苦 → 53% 悲伤、47% 痛苦、0% 绝望。
  • 对平面上每个点做一遍,可得概率热力图(颜色越深概率越大)。
  • 风控用法:悲伤兔子会喷恶心绿粘液,所以定规则「只要兔子 >30% 概率是悲伤就马上逃跑」——从此机器人再没被喷过。这是把概率输出转成阈值决策的例子。

结语

  • kNN 思路最简单,但实现要拿新样本和所有旧样本逐个算距离,数据量一大就非常耗时 → 需要高效算法,下一篇讲 kd 树。

机制 / 论证

  • 为什么「近朱者赤」成立:kNN 假设特征空间里相近的样本大概率同标签。它非参数、不假设分布,样本量够大时准确度很高(原文说法)。
  • 为什么量纲会毁掉 kNN:距离把各维差平方相加,数值大的轴贡献大;轴比例失衡时小数值轴等于没参与。所以任何距离类方法都要先做特征归一化。
  • 为什么概率版有用:边界样本无论归到哪类都可能错;概率输出 + 阈值让你能表达「拿不准」并据此做风控(逃跑)或放弃决策,比硬分类更适合带风险的应用。
  • 为什么 k 是偏差-方差开关:k 小 → 模型跟着每个点走(贴合历史 = 低偏差高方差/过拟合);k 大 → 边界平滑、忽略局部细节(高偏差低方差)。本文只给直觉,量化比较在第 41 篇。

可操作

  • 用 kNN 分类前的 checklist:
    1. 定特征,先做归一化(每轴除以 max−min),否则距离被大量纲轴主导。
    2. 选 k:小 k 更贴历史(易过拟合),大 k 更平滑(易欠拟合);样本少时谨慎。
    3. 分类:找最近 k 个已知样本,多数投票定类别;或统计 k 近邻里各类占比输出概率。
    4. 有风险偏好时,把概率输出配一个阈值做决策(兔子例:>30% 概率是悲伤就跑)。
  • kNN 需要足够多样本才稳;样本太少时「最近邻」可能全是噪声。
  • 本文是纯方法文,没有平台策略代码;聚宽里的用法见第 41 篇(scikit-learn)与第 43 篇(应用流程)。

术语

  • kNN(k-Nearest Neighbours):k 最近邻分类/回归。
  • 特征 / 类标签:特征是可测的输入(身高体重),标签是要判的类别(品种)。
  • L₂ / Lₚ / L∞ 距离:欧氏距离及其一般化。
  • 归一化(标准化):把各特征轴缩放到同一量纲(本文用除以 max−min)。
  • 概率 kNN:用 k 近邻里各类占比当概率输出。
  • 偏差-方差权衡:k 小偏方差(过拟合)、k 大偏偏差(欠拟合)。

不确定 / 待验证

  • 兔子身高体重分布图、15NN/1NN 分类边界图、概率热力图共 13 张都在附图(raw 只有图链);正文数字(40cm/2.7kg、k=15 vs 1、37/4.8、8:7=53%/47%)已按文字核对。
  • 「凭感觉选 k」是原文原话;k 的偏差-方差权衡本文只定性、没给数据与选择方法 [需要验证]。
  • 归一化公式给的是「除以 max−min」的 min-max 版(第 41 篇实现即此式);z-score 等其他标准化本文未提。
  • 配套 notebook(Untitled.ipynb,notebookCloneCount=538)展示分类与概率图,raw 未含代码。
  • 「距离函数选择应随数据特性而定」一句话带过;不同 metric 对结果的影响未展开。

相关

更新 2026-09-06

检索知识库

按标题、类型或正文检索