【机器学习】机器学习的基本分类-无监督学习-核密度估计(Kernel Density Estimation, KDE)

核密度估计(Kernel Density Estimation, KDE)

核密度估计(KDE)是一种非参数化方法,用于估计数据的概率密度函数(PDF)。与直方图相比,KDE 能够生成平滑的概率密度曲线,是统计数据分析中的重要工具。


1. 核密度估计的基本公式

假设我们有 n 个独立同分布的样本 ,核密度估计的公式为:

其中:

  • :估计的概率密度函数值。
  • :核函数,用于计算样本点对位置 xxx 的贡献。
  • :带宽(平滑参数),控制核函数的宽度。
  • n:样本数量。

2. 核函数 K

核函数决定了每个样本对目标位置 x 的影响。常见的核函数有:

核函数 表达式 特点
高斯核(Gaussian) 光滑、常用
均匀核(Uniform) ![K(u) = \begin{cases} \frac{1}{2}, & \text{if } u
三角核(Triangular) ![K(u) = \begin{cases} 1 - u
Epanechnikov 核 ![K(u) = \begin{cases} \frac{3}{4}(1 - u^2), & \text{if } u

是指示函数,值为 1 或 0,表示条件是否成立。


3. 带宽 h

带宽是 KDE 的关键参数,决定估计的平滑程度:

  • h 小:曲线更接近实际数据,可能导致过拟合。
  • h 大:曲线更光滑,但可能导致欠拟合。

带宽的选择通常通过交叉验证或其他算法自动完成。


4. KDE 的直观理解

  • KDE 的核心思想是将每个数据点 转化为一个核函数分布(如高斯分布),然后将所有核函数叠加,得到概率密度函数。
  • 直方图是一个简单的密度估计方法,而 KDE 是其平滑版。

5. KDE 的优缺点

优点
  1. 平滑:避免了直方图中"块状"分布的问题。
  2. 非参数:无需假设数据分布形状。
  3. 灵活:适合一维、多维数据。
缺点
  1. 计算复杂度高,特别是高维数据时。
  2. 带宽选择对结果影响较大。
  3. 对数据稀疏的区域,密度估计可能不准确。

6. KDE 的 Python 实现

以下是 KDE 的简单实现,使用 scipyseaborn 库:

数据生成
python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde

# 生成样本数据
np.random.seed(42)
data = np.concatenate([np.random.normal(0, 1, 500), np.random.normal(5, 1, 300)])

# 使用 scipy 进行 KDE
kde = gaussian_kde(data)
x = np.linspace(-3, 8, 1000)
density = kde(x)

# 绘制密度曲线
plt.figure(figsize=(8, 6))
plt.plot(x, density, label='KDE (Gaussian Kernel)', color='blue')
plt.hist(data, bins=30, density=True, alpha=0.4, label='Histogram', color='orange')
plt.title('Kernel Density Estimation')
plt.xlabel('Value')
plt.ylabel('Density')
plt.legend()
plt.show()
Seaborn 快速绘图
python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde
import seaborn as sns

# 生成样本数据
np.random.seed(42)
data = np.concatenate([np.random.normal(0, 1, 500), np.random.normal(5, 1, 300)])

# 使用 scipy 进行 KDE
kde = gaussian_kde(data)
x = np.linspace(-3, 8, 1000)
density = kde(x)

# 绘制密度曲线
sns.kdeplot(data, fill=True, color='blue', alpha=0.6)
plt.title('KDE with Seaborn')
plt.xlabel('Value')
plt.ylabel('Density')
plt.show()

7. 多维 KDE

对于多维数据,KDE 的公式为:

  • d 是数据的维度。
  • 核函数 K 可以扩展为多维(如多维高斯核)。

Python 示例(二维 KDE):

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde

# 生成样本数据
np.random.seed(42)
data = np.concatenate([np.random.normal(0, 1, 500), np.random.normal(5, 1, 300)])

# 使用 scipy 进行 KDE
kde = gaussian_kde(data)
# 生成二维数据
x, y = np.random.normal(0, 1, 500), np.random.normal(5, 1, 500)
xy = np.vstack([x, y])

# KDE 估计
kde = gaussian_kde(xy)
xx, yy = np.meshgrid(np.linspace(-3, 3, 100), np.linspace(3, 7, 100))
positions = np.vstack([xx.ravel(), yy.ravel()])
density = kde(positions).reshape(xx.shape)

# 绘图
plt.figure(figsize=(8, 6))
plt.contourf(xx, yy, density, levels=20, cmap='Blues')
plt.scatter(x, y, alpha=0.4, color='orange', s=10, label='Data Points')
plt.title('2D Kernel Density Estimation')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.show()

8. KDE 的实际应用场景

  1. 数据分布分析:探索数据的潜在分布。
  2. 异常检测:发现低密度区域的异常点。
  3. 概率估计:为概率模型提供基础。
  4. 模式识别:识别数据的高密度区域。
  5. 密度绘图:用于可视化数据分布。

9. KDE 的改进方向

  1. 快速算法:如基于网格的快速 KDE。
  2. 自动带宽选择:利用交叉验证等方法选择最优带宽。
  3. 结合其他方法:如在 GMM 中作为密度估计的辅助。

10. 总结

核密度估计(KDE)是统计分析和机器学习中的重要工具,其平滑、高灵活性的特点,使其成为直方图的强大替代方案。熟悉 KDE 的实现和参数选择,有助于更好地理解数据的分布特征并应用于实际问题。

相关推荐
undsky_几秒前
【RuoYi-SpringBoot3-Pro】:接入 AI 对话能力
人工智能·spring boot·后端·ai·ruoyi
2301_783360137 分钟前
【学习笔记】关于RNA_seq和Ribo_seq技术的对比和BAM生成
笔记·学习
qq_397731518 分钟前
Objective-C 学习笔记(第9章)
笔记·学习·objective-c
网易伏羲11 分钟前
网易伏羲受邀出席2025具身智能人形机器人年度盛会,并荣获“偃师·场景应用灵智奖
人工智能·群体智能·具身智能·游戏ai·网易伏羲·网易灵动·网易有灵智能体
搬砖者(视觉算法工程师)15 分钟前
什么是无监督学习?理解人工智能中无监督学习的机制、各类算法的类型与应用
人工智能
西格电力科技21 分钟前
面向工业用户的绿电直连架构适配技术:高可靠与高弹性的双重设计
大数据·服务器·人工智能·架构·能源
TextIn智能文档云平台25 分钟前
图片转文字后怎么输入大模型处理
前端·人工智能·python
Hy行者勇哥26 分钟前
从零搭建小智 AI 音箱 MCP 开发环境:自定义智能家居控制技能实战指南
人工智能·嵌入式硬件·硬件工程·智能家居
leaf_leaves_leaf26 分钟前
强化学习奖励曲线
人工智能
数据的世界0126 分钟前
重构智慧书-第18条:实力与实干
人工智能