🏠 总目录📚 本教程 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 通常取奇数 二分类时避免平票

⚡ 预测慢怎么办

关键信息

🔗 这就是推荐算法里向量检索要解决的问题—— 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. 参数方法用"假设"换效率和小样本表现;非参数用"数据量"换不做假设的自由。假设对了参数赢,假设错且数据多则非参数赢。

🛑 可以停在这里

⚡ 走神救援

先记住这几件事

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

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