以下是使用 Python 绘制核密度估计(Kernel Density Estimation, KDE)模型的完整示例代码和说明:
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 生成示例数据(混合高斯分布)
data = np.concatenate([
np.random.normal(0, 1, 500),
np.random.normal(5, 1.5, 500)
])
# 绘制 KDE 曲线
plt.figure(figsize=(10, 6))
sns.kdeplot(data,
bw_method=0.5, # 带宽参数
fill=True,
color='skyblue',
linewidth=2)
# 添加直方图叠加
plt.hist(data, bins=30, density=True, alpha=0.5, color='steelblue')
# 美化图形
plt.title('Kernel Density Estimation (1D)', fontsize=14)
plt.xlabel('Value', fontsize=12)
plt.ylabel('Density', fontsize=12)
plt.grid(alpha=0.3)
plt.show()
from scipy.stats import gaussian_kde
# 生成示例数据
data = np.random.normal(size=1000)
# 计算 KDE
kde = gaussian_kde(data, bw_method=0.2) # 带宽参数
x_grid = np.linspace(min(data)-1, max(data)+1, 1000)
# 绘制结果
plt.figure(figsize=(10, 6))
plt.plot(x_grid, kde.evaluate(x_grid),
color='darkred',
lw=2,
label='KDE')
# 添加原始数据点
plt.scatter(data, np.zeros_like(data),
alpha=0.1,
color='red',
marker='|',
label='Data Points')
plt.title('Custom KDE with Scipy', fontsize=14)
plt.xlabel('Value', fontsize=12)
plt.ylabel('Density', fontsize=12)
plt.legend()
plt.grid(alpha=0.3)
plt.show()
# 生成二维数据
x = np.random.normal(size=1000)
y = x * 0.5 + np.random.normal(scale=0.3, size=1000)
# 绘制二维 KDE
plt.figure(figsize=(10, 8))
sns.kdeplot(x=x, y=y,
cmap='viridis',
fill=True,
thresh=0.05, # 显示密度阈值
levels=20) # 等高线数量
# 添加数据点
plt.scatter(x, y, alpha=0.3, color='white', edgecolor='black', s=20)
plt.title('2D Kernel Density Estimation', fontsize=14)
plt.xlabel('X', fontsize=12)
plt.ylabel('Y', fontsize=12)
plt.grid(alpha=0.3)
plt.show()
带宽参数 (bw_method
)
'scott'
/'silverman'
自动选择常用可视化选项
fill=True
:填充密度曲线下方区域levels
:指定等高线数量(2D KDE)cmap
:设置颜色映射(2D KDE)alpha
:控制透明度pip install numpy matplotlib seaborn scipy
方法 | 优点 | 缺点 |
---|---|---|
Seaborn | 快速简单,适合EDA | 自定义选项有限 |
Scipy | 完全控制计算过程 | 需要手动处理可视化 |
Statsmodels | 提供更多统计功能 | 需要额外安装库 |
通过调整带宽参数和可视化选项,可以创建不同风格的密度估计图。建议先用 Seaborn 快速探索数据分布,再根据需要使用 Scipy 进行更精细的定制化分析。