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