1. 问题现象与诊断
当使用statsmodels.nonparametric.KernelDensity进行概率密度估计时,开发者常遇到以下典型症状:
- 密度曲线呈现锯齿状波动(高频振荡)
- 在训练数据点处出现异常尖峰
- 测试集对数似然值比训练集低30%以上
- 使用
KernelDensityResults.resample()生成的数据明显偏离真实分布
2. 根本原因分析
通过分解核密度估计公式:
\[ \hat{f}(x) = \frac{1}{n} \sum_{i=1}^n K_h(x - x_i) \]
其中带宽参数h过小会导致:
- 每个数据点处的核函数影响范围过窄
- 核函数乘积效应放大噪声
- 违反密度函数积分等于1的基本性质
3. 解决方案对比
| 方法 | 实现代码 | 适用场景 |
|---|---|---|
| Silverman规则 | kde = KDEMultivariate(data, bw='normal_reference') |
单峰近似正态分布 |
| 交叉验证 | grid = GridSearchCV(estimator=kde, param_grid={'bandwidth': np.linspace(0.1,1,20)}) |
计算资源充足时 |
| Scott修正 | bw = n**(-1./(d+4)) |
高维数据(d>3) |
4. 最佳实践验证
通过模拟数据验证不同带宽效果:
import numpy as np
from statsmodels.nonparametric.kernel_density import KDEMultivariate
np.random.seed(42)
data = np.concatenate([np.random.normal(0,1,500),
np.random.normal(5,2,300)])
# 过小带宽示例
kde_bad = KDEMultivariate(data, bw=0.05)
# 优化带宽示例
kde_good = KDEMultivariate(data, bw='normal_reference')
5. 进阶优化策略
对于多模态分布建议:
- 采用自适应带宽(Balloon Estimator)
- 使用可变核方法(Nearest Neighbor Bandwidth)
- 结合聚类预处理进行分段估计