🏠 总目录📚 本教程 04 · 非参数方法
📑 本页目录(点开跳转)

04 · 非参数方法:把数据本身当模型

26 分钟 | ⭐ 核心概念


🎯 一句话

参数方法先假定一个函数形式(比如"它是条直线")再去拟合; 非参数方法不做这个假设,直接把训练数据本身当成模型

⚠️ 名字有误导:「非参数」不是「没有参数」,而是「参数的数量随数据增长」。


⚖️ 一、两种范式的根本区别

参数方法 Parametric 非参数方法 Non-parametric
对 f 的假设 先假设 f 的形式(直线/多项式) 不假设形式
训练在做什么 求出固定个数的参数 把数据存起来
训练完 可以丢掉数据 ✅ 必须保留全部数据 ❌
预测速度 快 O(d) 慢 O(nd)
假设错了 系统性偏差 数据够多 → 能逼近任意函数 ✅
小数据 表现更稳 方差大
例子 线性回归、逻辑回归 kNN、核回归、决策树*

💡 一句话记忆

参数方法把知识【压缩进权重】里;非参数方法把知识【留在数据】里。

🔬 用偏差-方差看这个区别(第 8 章的预告)

   参数方法:假设限制了模型能表达的函数
             → 偏差可能很大(如果假设错了)
             → 但方差小(参数少,不容易被数据抖动带偏)

   非参数方法:几乎不限制
             → 偏差小(n→∞ 时能逼近真实函数,这叫【一致性】)
             → 但方差大(对数据非常敏感)

🔑 所以选择的本质是你对函数形式的假设,有多大把握是对的? 有把握 → 参数方法(用假设换方差);没把握且数据多 → 非参数方法。


🎯 二、kNN:最纯粹的非参数方法

   训练阶段:把数据存起来。完。      ← 所以叫【惰性学习】lazy learning
   预测阶段:
     ① 找出离查询点最近的 K 个训练样本
     ② 分类 → 投票;回归 → 取平均

K 的作用就是偏差-方差旋钮

   K = 1        每个点只听最近的那一个邻居
                → 决策边界极其锯齿
                → 训练误差 = 0(每个点的最近邻就是自己!)
                → 高方差、低偏差 → 【过拟合】

   K = n        所有点都听全体平均
                → 决策边界消失,输出常数
                → 低方差、高偏差 → 【欠拟合】

   K 适中       ✅

⚠️ 一个容易被忽略的细节K=1 时训练误差恒为 0, 因为每个训练点的最近邻就是它自己。 这是「训练误差完全没有参考价值」的最极端例子——必须用交叉验证选 K。

🔗 这和基础教程第 1 章 那张「决策树深度表」是同一个现象—— 每个模型都有一个控制复杂度的旋钮,你要找的永远是那个拐点。

四个实践要点

要点 说明
必须标准化 kNN 用距离,尺度大的特征会主导(对比:树模型不需要)
距离度量的选择 欧氏(默认)/ 曼哈顿(对离群维度更稳)/ 余弦(文本常用)
加权投票 越近的邻居权重越大,如 w = 1/d 或高斯核 —— 这就通向了第 6 章
K 通常取奇数 二分类时避免平票

⚡ 预测慢怎么办

   朴素 kNN:每次预测要和【全部 n 个】训练点算距离 → O(nd)

   加速手段:
   ├─ KD-Tree / Ball-Tree   低维(d < 20)时有效,高维退化成暴力
   ├─ ANN 近似最近邻 ⭐      HNSW / IVF —— 牺牲一点精度换几百倍速度
   └─ 降维后再检索           先 PCA 再 kNN

🔗 这就是推荐算法里向量检索要解决的问题—— RAG、向量数据库、以图搜图,本质都是「大规模 kNN 怎么做快」。


🌾 三、从 kNN 到核密度估计

   kNN 的加权版本:不是"取最近 K 个",而是"所有点都算,但按距离加权"

   权重函数 = 1/d            →  简单反比
   权重函数 = exp(−d²/2h²)   →  高斯核 ⭐

                    ↑ 这个"权重函数"就叫【核 kernel】

核密度估计(KDE):把每个数据点想象成一个小钟形,全部叠加起来:

$$\hat p(x) = \frac{1}{nh^d}\sum_{i=1}^n K\left(\frac{x - x_i}{h}\right)$$

   数据点:   ·      ·  ·        ·
              ↓      ↓  ↓        ↓
   每点放一个钟形:
             ╱╲    ╱╲╱╲        ╱╲
   叠加后:  ╱  ╲__╱      ╲____╱  ╲    ← 估计出的概率密度

💡 一个重要的观察

「离得近的样本更重要」这个朴素想法,正式化之后就是核方法。

h(带宽)控制"多远算近"——它又是一个偏差-方差旋钮

h 效果
h 小 只听身边极近的点 → 密度曲线毛刺很多 → 高方差
h 大 听得太远 → 曲线过度平滑,细节被抹平 → 高偏差

⚠️ 注意术语撞车:这里的「核」(加权函数)和第 6 章 SVM 的「核」 (内积替换)名字一样但含义不同——虽然数学上有联系(RBF 核两边都用)。


🌲 四、决策树:介于两者之间

   决策树的结构(切几刀、切在哪)由【数据】决定  → 非参数的一面
   但训练完之后可以【丢掉数据】               → 参数的一面

   → 通常归为非参数方法,但和 kNN 很不同
惰性学习 Lazy 急切学习 Eager
训练 几乎不干活 干活
预测
存储 全部数据 只存模型
新数据加入 直接加,无需重训 ⭐ 通常要重训
例子 kNN、核回归、KDE 线性模型、决策树、神经网络

💡 惰性学习的一个隐藏优势增量更新几乎免费。 这在推荐系统的物品冷启动等场景里很有价值——新物品直接进索引就能被检索到。


🔬 五、非参数方法的理论性质

一致性(Consistency)

n → ∞ 时,kNN 的误差收敛到贝叶斯最优误差(在合适条件下)。

💡 人话数据足够多时,kNN 能达到理论上的最好水平——不管真实函数多复杂。

条件(了解即可):

   K → ∞      (邻居数要增加,否则方差降不下来)
   K/n → 0    (但增长要比 n 慢,否则偏差上升)

   ⭐ 实践中常取 K ≈ √n

⚠️ 但"足够多"是多少?

   一致性是【渐近】性质,它不告诉你有限样本下的表现

   而 kNN 的收敛速率随维度【指数级】变慢:
   要达到同样精度,d 维需要的样本数 ∝ ε^(−d)

   → d = 20 时,你永远等不到"足够多"  💀

🔗 这正是第 5 章维度灾难的另一种表述—— 非参数方法的理论优势(能逼近任意函数)在高维下变成了空头支票。


⚖️ 六、什么时候该用非参数方法

情况 建议
数据量大、维度低(d < 20) ✅ 非参数能逼近真实函数
完全不知道函数长什么样 ✅ 不做假设是优点
数据分布很不规则(多峰、非线性边界) ✅ 参数方法很难拟合
需要频繁增量更新 ✅ 惰性学习免重训
维度高(d > 50) 维度灾难——kNN 会彻底失效
需要快速预测 ❌ kNN 每次预测都要扫全库(除非上 ANN)
数据少 ❌ 非参数方法很吃数据量
需要可解释的规律 ❌ kNN 给不出"为什么"

🔑 核心权衡参数方法用「假设」换「效率和小样本表现」; 非参数方法用「数据量」换「不做假设的自由」。

假设对了,参数方法赢;假设错了且数据够多,非参数方法赢。


🔗 七、和站内其他章的关系

相关的地方 这里的位置
基础教程第 4 章决策树 非参数方法的一种(急切型)
推荐算法的 ItemCF 本质就是 kNN——找最相似的 K 个物品
推荐算法的向量检索 ANN 就是在解决 kNN "预测慢"的问题
RAG 的向量检索 同样是大规模 kNN
高斯核加权 通向第 6 章核方法
第 5 章维度灾难 非参数方法的死穴

💡 一个有意思的连接:你在推荐算法里学的 ItemCF, 换个说法就是「在物品的共现向量空间里做 kNN」。 而 ANN 索引解决的正是本章说的"预测慢", 向量数据库的整个行业,本质是在给 kNN 做工程优化。


✅ 检查点

  1. 「非参数」的准确含义是什么?(不是"没有参数")
  2. 用偏差-方差解释参数 vs 非参数的区别。
  3. kNN 的 K 控制什么?K=1 时训练误差是多少?这说明什么?
  4. 为什么 kNN 必须标准化而树模型不用?
  5. 核密度估计里的 h 控制什么?和 K 是什么关系?
  6. 惰性学习有什么隐藏优势?
  7. kNN 的"一致性"是什么?为什么在高维下是空头支票?
  8. 参数 vs 非参数的核心权衡是什么?
👀 答案
  1. 参数的数量随数据量增长(而非固定几个)。它指的是不预设函数形式
  2. 参数方法用假设限制了表达能力 → 偏差可能大但方差小;非参数几乎不限制 → 偏差小(n→∞ 能逼近真实函数)但方差大。
  3. 控制模型复杂度(偏差-方差旋钮)。K=1 时训练误差恒为 0(每个点的最近邻是自己)——说明训练误差完全没有参考价值,必须用交叉验证。
  4. kNN 基于距离计算,尺度大的特征会主导距离;树模型只做大小比较切分,与尺度无关。
  5. 控制"多远算近",是偏差-方差旋钮:h 小→毛刺多高方差;h 大→过度平滑高偏差。它和 K 起同样的作用,只是一个是"取几个",一个是"权重衰减多快"。
  6. 增量更新几乎免费——新数据直接加入即可,不需要重训。
  7. n→∞ 时误差收敛到贝叶斯最优(能达到理论最好水平)。但收敛速率随维度指数变慢(样本需求 ∝ ε^(−d)),d=20 时永远等不到"足够多"。
  8. 参数方法用"假设"换效率和小样本表现;非参数用"数据量"换不做假设的自由。假设对了参数赢,假设错且数据多则非参数赢。

🛑 可以停在这里

走神救援

⚠️「非参数」不是「没有参数」,而是「参数的数量随数据增长」,真正的含义是不预设函数形式。参数方法先假定 f 的形式再拟合:训练完可以丢掉数据、预测快 O(d),但假设错了就是系统性偏差;非参数方法直接把数据本身当模型:必须全存下、预测慢 O(nd)、方差大,但数据够多就能逼近任意函数参数方法把知识压进权重里,非参数方法把知识留在数据里;选择的本质是——你对函数形式的假设有多大把握kNN 最纯粹:训练只是把数据存起来(惰性学习),预测时找最近 K 个投票或取平均。K 是偏差-方差旋钮:K=1 过拟合,⚠️且训练误差恒为 0(每个点的最近邻就是它自己)——这是「训练误差完全没有参考价值」的最极端例子,必须用交叉验证选 K;K=n 则输出常数、欠拟合。⭐必须标准化(kNN 靠距离,尺度大的特征会主导;树模型不需要);加权投票就通向了核方法。预测慢的解法:KD-Tree 只在低维(d 小于 20)有效、高维退化成暴力,得上 ANN 近似最近邻,牺牲一点精度换几百倍速度——向量数据库本质就是「大规模 kNN 怎么做快」。推到极致就是核密度估计带宽 h 又是同一个偏差-方差旋钮(h 小毛刺多,h 大过度平滑)。⚠️这里的「核」是加权函数,和第 6 章的「核」不同。💡惰性学习的隐藏优势是增量更新几乎免费,利于冷启动。理论上 kNN 有一致性:n→∞ 时误差收敛到贝叶斯最优(实践常取 K ≈ √n)。⚠️但这是渐近性质:收敛速率随维度指数级变慢,同样精度下 d 维需要的样本数 ∝ ε^(−d),d=20 时永远等不到「足够多」——这个优势在高维下就是空头支票。权衡:参数方法用「假设」换效率和小样本表现,非参数方法用「数据量」换不做假设的自由

下一节 👉 05-维度灾难.md ⭐⭐⭐

打卡记录保存在你的浏览器里,首页能看到总进度