大自然是一个无限的球体,其中心无处不在,圆周无处可寻。
Nature is an infinite sphere of which the center is everywhere and the circumference nowhere.
—— 布莱兹·帕斯卡 (Blaise Pascal)
法国哲学家、科学家 | 1623 ~ 1662
🐍 Python工具箱
matplotlib.pyplot.fill_between()区域填充颜色
seaborn.kdeplot()绘制KDE概率密度估计曲线
sklearn.neighbors.KernelDensity()概率密度估计函数
statsmodels.api.nonparametric.KDEUnivariate()构造一元KDE
statsmodels.nonparametric.kde.kernel_switch()更换核函数
statsmodels.nonparametric.kernel_density.KDEMultivariate()构造多元KDE
概率密度估计:从直方图说起
Probability Density Estimation: Starting from Histogram
简单来说,概率密度估计 (probability density estimation) 就是
寻找合适的随机变量概率密度函数,使其尽量贴合样本数据分布情况。
📊 直方图
直方图实际上是最常用的一种概率密度估计方法。本书第2章介绍过,为了构造直方图:
合理地选择组距,让大家一眼能够通过直方图看出样本分布的大致情况。
纵轴的频数,也可以替换成概率、概率密度。
当纵轴为概率密度时,直方图这些矩形面积之和为1,对应概率1。
概率密度估计结果呈现阶梯状,不"平滑"。
很多数据科学、机器学习应用场合,我们需要得到连续平滑的密度估计曲线。
📈 参数估计
本书前文介绍一些常见的概率分布函数,但是它们的形状远远不够描述现实世界采集的分布情况较为复杂的样本数据。
这样可以直接用正态分布来估计样本数据在某个单一特征上的分布情况:
因此这种方法也被称作参数估计。
如图2所示,高斯分布显然比图1的直方图"平滑"的多。
对比图1和图2,容易发现样本分布细节被忽略。
最明显的是鸢尾花花瓣长度(图1(c)、图2(c))、花瓣宽度(图1(d)、图2(d))这两个特征上样本数据的分布。
多数情况,样本数据分布不够"正态",仅仅使用均值μ和均方差σ描述数据不合适。
🌊 核密度估计
下面介绍本章的主角——核密度估计 (Kernel Density Estimation, KDE)。
- 鸢尾花单一特征概率密度
- 联合概率密度
最常见的核函数是高斯核函数,本章还会介绍并比较其他核函数。
下面我们聊一聊核密度估计原理。
📊 概率密度估计方法对比
Probability Density Estimation Methods
估计方法
参数设置
• 呈现阶梯状
• 不够平滑
• 依赖组距选择
数据信息
• 样本量:n = 150
• 范围:[4.5, 7.1]
图1. 直方图估计
• 简单直观
• 计算快速
缺点:
• 不平滑
• 依赖组距
• 平滑曲线
• 易于理解
缺点:
• 丢失细节
• 分布假设
• 平滑曲线
• 保留细节
缺点:
• 需选带宽
• 计算较慢
- 直方图 — 最简单但不平滑
- 参数估计 — 平滑但可能丢失分布细节
- 核密度估计KDE — 平滑且保留细节,是本章重点
- 鸢尾花数据 — 花瓣长度和宽度分布不够正态
- 实际应用 — 数据科学、机器学习需要平滑密度曲线
代码使用 seaborn.kdeplot() 绘制KDE曲线。
本章后续分别介绍几种不同的办法绘制KDE曲线。
🎯 17.1 关键要点
• 阶梯状
• 不够平滑
• 依赖组距选择
• 平滑曲线
• 丢失细节
• 假设分布形式
• 平滑曲线
• 保留细节
• 本章主角
• 直方图:简单但阶梯状,不平滑
• 参数估计:平滑但可能丢失分布细节(如鸢尾花花瓣数据)
• 核密度估计:平滑+保留细节,是数据科学和机器学习的首选
• 鸢尾花数据:四个特征分布各异,展示了不同方法的优缺点
核密度估计:若干核函数加权叠合
KDE: Weighted Sum of Kernel Functions
核密度估计其实是对直方图的一个自然拓展。
直方图不够平滑,我们引入合适的核函数得到更加平滑的概率密度估计曲线。
前文说到,核函数种类很多,本节以高斯核函数为例介绍核密度估计原理。
💡 原理
任意一个数据点x(i),都可以用一个函数来描述,这个函数就是核函数。
白话说,图4中这7条曲线等权重叠加便得到核密度估计概率密度曲线。
📐 公式2:单个核函数
x - xi 代表曲线在水平方向平移
h (h > 0) 是核函数的缩放系数,又叫带宽
📊 公式3:叠加 → 平均
也就是说,每个核函数贡献的面积为1/n。
🔔 高斯核函数(公式4)
🔄 对称性(公式5)
由于核函数K(x)关于纵轴对称,因此K(x - xi)关于x = xi对称。
📏 缩放
大家是否还记得图5?我们在讲解函数图像变换时提过:
展示了函数在水平方向、竖直方向伸缩的效果。
📐 面积为1(公式6)
利用换元积分,很容易得到等式,解释了为什么f(x)和cf(cx)面积相同。
🌊 核密度估计原理:若干核函数加权叠合
KDE Principle: Weighted Sum of Kernel Functions
带宽 h
显示选项
数据点
面积归一化
• 总面积: 7 × 0.143 = 1
• 无论h大小,总面积始终为1
图6. 用7个高斯核函数构造的概率密度估计曲线
对称性(公式5)
因此K(x-xᵢ)关于x=xᵢ对称。
面积为1(公式6)
利用换元积分,f(x)和cf(cx)面积相同。
📐 缩放(公式2)
• h小 → 核函数细高
• h大 → 核函数矮胖
• 面积始终为1
来自《数学要素》第12章,展示f(x)和cf(cx)面积相同的原理
叠加 → 平均
如图6所示,每个数据点给总的概率密度曲线估计贡献一条曲线。
1. 对每个数据点xᵢ,构造核函数(1/h)K((x-xᵢ)/h)
2. 每条曲线和横轴的面积为1/n
3. 叠加n个核函数
4. 平均:乘以1/n
5. 得到的曲面和横轴围成图形的面积为1
公式推导
• 缩放:除以h
• 归一化:乘以1/h
• 平均:乘以1/n
• 保证总面积为1
- 核函数 — 用来描述每个数据点,最常见的是高斯核
- 对称性 — K(x) = K(-x),关于纵轴对称
- 面积为1 — 每个核函数积分为1
- 带宽h — 控制核函数高矮胖瘦,h小则细高,h大则矮胖
- 叠加平均 — n个核函数叠加后除以n,保证总面积为1
- KDE本质 — 直方图的自然拓展,更加平滑
可视化"叠加"
以图4为例,假设7个样本数据构成的集合为 {-3, -2, 0, 2, 2.5, 3, 4}。
每一条曲线和横轴的面积为1/7。
叠加得到的曲面和横轴围成图形的面积为1。
以鸢尾花数据为例
statsmodels.api.nonparametric.KDEUnivariate()对象得到的概率密度估计曲线。大家可以自行改变代码中带宽h。
🎯 17.2 关键要点
• 高斯核最常见
• 对称性K(x)=K(-x)
• 面积为1
• 控制高矮胖瘦
• h小→细高
• h大→矮胖
• 平均:除以n
• 总面积为1
• 平滑曲线
• 平移x-xᵢ:让核函数中心对准数据点
• 缩放1/h:控制核函数宽度,保持面积为1
• 叠加平均:每个核贡献1/n,总面积为1
• 公式2-6:构成KDE的完整数学基础
• 图6:7个数据点演示KDE叠加原理
带宽:决定核函数高矮胖瘦
Bandwidth: Determining Kernel Shape
带宽h选取对概率密度估计函数至关重要。
h决定了每一个核函数的高矮胖瘦。
📏 h对高斯核函数形状的影响
• 在数据点附近集中
• 影响范围窄
• 影响范围广
• 更加平坦
📏 带宽:决定核函数高矮胖瘦
Bandwidth: Determining Kernel Shape
带宽 h
✓ h适中
• 适当的密度估计
• 理想选择
显示选项
面积归一化
图9. 带宽h对高斯核函数形状的影响
图10. 核函数带宽对概率密度估计曲线的影响(鸢尾花萼片长度)
不同带宽对比
实践指南
• 出现噪声和不必要的波动
• 过拟合数据
• 大量有用信息被忽略
• 欠拟合数据
• 如鸢尾花花瓣的双峰分布会被平滑成单峰
- 带宽h至关重要 — 决定核函数高矮胖瘦
- h小 — 核函数细高,曲线不够平滑,过拟合
- h大 — 核函数矮胖,曲线过度平滑,欠拟合
- 需要平衡 — 在平滑度和细节保留之间取舍
- 面积恒定 — 无论h大小,总面积始终为1
- 实际应用 — 通常通过交叉验证等方法选择最优h
过小的h
• 曲线出现噪声和波动
• 对数据中的随机误差过于敏感
• 过拟合:过度拟合样本数据
• 泛化能力差
可以看到曲线有明显的锯齿状波动。
太大的h
• 大量有用信息被忽略
• 重要的分布特征(如双峰)被平滑掉
• 欠拟合:模型过于简单
• 无法捕捉数据的真实分布
花瓣长度和宽度的双峰特征被显著平滑。
面积恒定原理
不管h的大小,合成得到的概率密度曲线与横轴包裹区域的面积始终保持为1。
缩放系数1/h保证了即使改变带宽,单个核函数的面积仍为1。
图10:三种带宽效果对比
| 特征 | h = 0.5 | h = 1 | h = 2 |
|---|---|---|---|
| 核函数形状 | 较细高 | 适中 | 矮胖 |
| 平滑度 | 较低 | 适中 | 很高 |
| 细节保留 | 较多 | 平衡 | 丢失 |
| 拟合状态 | 可能过拟合 | 适当 | 可能欠拟合 |
| 适用场景 | 数据量大 | 一般场景 | 粗略估计 |
🌸 鸢尾花数据示例
• 曲线不够平滑
• 出现锯齿状波动
• 过度拟合数据点
• 曲线较为平滑
• 但花瓣特征的双峰被平滑
• 丢失部分细节信息
如何选择带宽h?
• 经验法则:Scott's rule, Silverman's rule
• 交叉验证:通过验证集选择最优h
• 网格搜索:在一定范围内尝试多个h值
• 可视化检查:观察不同h下的KDE曲线
在平滑度(减少噪声)和细节保留(捕捉真实分布)之间取得平衡。
🎯 17.3 关键要点
• 不够平滑
• 噪声波动
• 过拟合风险
• 平滑+细节
• 适当拟合
• 理想选择
• 过度平滑
• 丢失细节
• 欠拟合风险
• 图9:展示h对单个核函数形状的影响
• 图10:对比h=0.5, 1, 2三种情况
• 图11和12:鸢尾花数据在h=0.1和h=1下的实际效果
• 面积恒定:无论h大小,总面积始终为1
• 实践建议:使用交叉验证或经验法则选择最优h
核函数:8种常见核函数
8 Common Kernel Functions
总结来说,核函数需要满足两个重要条件:
📐 公式9:核函数的两个必要条件
利用换元积分,可以证明:
🔧 核函数:8种常见核函数
8 Common Kernel Functions
选择核函数
当前核函数
gau核函数特点
表1:核函数形状
图13:不同核函数的KDE效果(鸢尾花萼片长度)
表1:8种核函数形状对比
核函数特性对比
| 核函数 | 支撑 | 平滑度 | 计算复杂度 | 常用程度 |
|---|---|---|---|---|
| ● Gaussian | 无限 | ★★★ | 中 | ★★★ |
| ● Epanechnikov | [-1,1] | ★★ | 低 | ★★ |
| ● Uniform | [-1,1] | ★ | 极低 | ★ |
| ● Triangular | [-1,1] | ★★ | 低 | ★ |
| ● Biweight | [-1,1] | ★★ | 低 | ★ |
| ● Triweight | [-1,1] | ★★★ | 低 | ★ |
| ● Cosine | [-1,1] | ★★ | 中 | ★ |
| ● Cosine2 | [-1,1] | ★★ | 中 | ★ |
- 两个必要条件 — 对称性K(x)=K(-x),面积为1
- Gaussian最常用 — 无限支撑,最光滑
- Epanechnikov最优 — MSE最小,理论上最佳
- 有限vs无限支撑 — Gaussian无限,其他7种有限
- 实际影响有限 — 不同核函数结果相似,带宽h更重要
- 选择建议 — 实践中Gaussian即可,计算方便
表1:8种常见核函数汇总
| 核函数 | 代码 | 函数公式 | 支撑 |
|---|---|---|---|
| Gaussian | gau | K(x) = (1/√(2π))exp(-x²/2) | (-∞,+∞) |
| Epanechnikov | epa | K(x) = (3/4)(1-x²), |x|≤1 | [-1,1] |
| Uniform | uni | K(x) = 1/2, |x|≤1 | [-1,1] |
| Triangular | tri | K(x) = 1-|x|, |x|≤1 | [-1,1] |
| Biweight | biw | K(x) = (15/16)(1-x²)², |x|≤1 | [-1,1] |
| Triweight | triw | K(x) = (35/32)(1-x²)³, |x|≤1 | [-1,1] |
| Cosine | cos | K(x) = (π/4)cos(πx/2), |x|≤1 | [-1,1] |
| Cosine2 | cos2 | K(x) = (1/2)(1+cos(2πx)), |x|≤1 | [-1,1] |
图13:八个不同核函数得到的不同的概率密度估计
图13所示为这8种不同核函数估计得到的鸢尾花花萼长度概率密度曲线。
• 不同核函数形状差异明显
• 但KDE结果相似
• 说明核函数选择的影响相对有限
• 带宽h的选择更为关键
也请大家学习使用sklearn.neighbors.KernelDensity()函数
获得概率密度估计曲线。
🎯 17.4 关键要点
• 面积为1:∫K(x)dx=1
• 这两个条件保证概率密度的有效性
• Epanechnikov:理论最优
• 其他6种:各有特点
• 表1:8种核函数的完整数学定义
• 图13:不同核函数在实际数据上的效果对比
• 实践结论:核函数选择影响相对较小,Gaussian是最常用选择
• 重要性排序:带宽h >> 核函数类型
• Epanechnikov:理论上MSE最小,但实际与Gaussian差异不大
如何选择核函数?
• 首选Gaussian:计算方便,效果好,最常用
• 追求效率:Epanechnikov理论最优,MSE最小
• 简单快速:Uniform或Triangular,计算量小
• 平滑要求高:Triweight,三次光滑
在大多数应用中,核函数的选择对结果影响不大。
相比之下,带宽h的选择要重要得多。
因此,实践中直接使用Gaussian核函数即可。
二元KDE:概率密度曲面
Bivariate KDE: Probability Density Surface
二元,乃至多元KDE的原理和前文所述的一元KDE完全相同。
📐 公式10:多元KDE
如下多个核函数叠加、再平均便得到概率密度估计:
• 默认x和xi均为列向量
• xi起到平移作用
• 原理和一元KDE完全相同,只是从标量扩展到向量
🔔 高斯核函数(公式11)
🌐 二元高斯核函数(公式12)
• H = h²I(单位矩阵)
• 各维度独立同分布
• 简化计算
• ||x-xᵢ||²:欧氏距离平方
• 二维:(x₁-xᵢ₁)² + (x₂-xᵢ₂)²
• 对称分布
🌐 二元KDE:概率密度曲面
Bivariate KDE: Probability Density Surface
带宽 h
显示选项
数据信息
• H: 带宽矩阵
• K_H: 二元核函数
公式11-12:高斯核
• IID假设:H = h²I
图16:鸢尾花花萼长度和宽度的KDE曲面等高线图
图14:二元高斯KDE原理
这些曲面先叠加、再平均便获得二元高斯核KDE估计得到概率密度曲面。
• 一元KDE:n条曲线叠加
• 二元KDE:n个曲面叠加
• 多元KDE:n个超曲面叠加
• 数学公式:f̂(x) = (1/n)Σᵢ K_H(x - xᵢ)
图15:鸢尾花花萼长度和宽度的KDE曲面(3D视图)
• 峰值对应数据集中区域
• 三个峰对应三个鸢尾花品种
• 平滑曲面展示分布的连续性
• 高度=概率密度
• 直观展示分布形状
• 适合演示和理解
• 等高线=等密度线
• 便于精确读数
• 适合分析和计算
- 原理相同 — 二元/多元KDE原理和一元KDE完全相同
- 带宽矩阵 — 一元h标量 → 多元H矩阵(正定)
- IID假设 — H = h²I,简化为各维度独立同分布
- 叠加平均 — n个二元高斯曲面叠加后除以n
- 可视化 — 3D曲面(图15)或2D等高线(图16)
- 实际应用 — 分类、聚类、异常检测
图14:二元高斯KDE原理
这些曲面先叠加、再平均便获得二元高斯核KDE估计得到概率密度曲面。
• 一元KDE:n条曲线 → 叠加 → 平均
• 二元KDE:n个曲面 → 叠加 → 平均
• 多元KDE:n个超曲面 → 叠加 → 平均
原理完全相同!
🌸 以鸢尾花数据为例
• 高度代表概率密度
• 峰值对应数据集中区域
• 直观理解分布形状
• 等高线代表等密度线
• 便于精确读数
• 适合分析和计算
sklearn.neighbors.KernelDensity()注意事项
sklearn.neighbors.KernelDensity()函数也可以用来概率密度估计。注意:这个函数返回的是对数概率密度 ln(PDF)。
如需实际概率密度,需要对结果取指数:PDF = exp(ln(PDF))
🎯 实际应用
• 探索数据的内在结构
• 发现数据中的模式
• 聚类:发现数据簇
• 异常检测:识别低密度区域
• 参数估计
• 模型比较
• 后验概率估计
• 下面章节将详细介绍
🎯 17.5 关键要点
• 从标量扩展到向量
• 从曲线扩展到曲面
• 数学公式统一
• 多元:H矩阵(正定)
• IID假设:H = h²I
• 简化计算
• 公式11-12:多元高斯核定义
• 图14:二元KDE原理(曲面叠加)
• 图15-16:鸢尾花数据3D曲面和等高线
• 非参数方法:不假设分布形式,灵活适用
• 务必掌握:高斯核密度估计在贝叶斯分类中的应用
📚 第17章总结
核心方法
关键公式
重要结论
本章内容到此结束
可以用来估计连续随机变量的概率密度函数。
我们会在贝叶斯分类中看到这个工具的应用。
🎯 频率派 → 贝叶斯派
本书有关频率学派的内容到此结束
分类、推断两类问题的应用。
• 第16章:统计推断
• 第17章:概率密度估计
• 参数固定但未知
• 概率=频率
• 第18-22章:贝叶斯方法
• 参数是随机变量
• 先验→后验
• 本书重点!