【机器学习】机器学习的基本分类-无监督学习-核密度估计(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 的实现和参数选择,有助于更好地理解数据的分布特征并应用于实际问题。

相关推荐
Yunzenn1 分钟前
深度分析字节最新研究cola-DLM第 01 章:语言生成的三次范式之争 —— 从 RNN 到 AR 到扩散
linux·人工智能·rnn·深度学习·机器学习·架构·transformer
m0_634666731 分钟前
Stability Audio 3.0 把 AI 音乐推过了一个门槛:从“音频片段”走向“完整歌曲”
人工智能·音视频
楼田莉子2 分钟前
C#学习之C#入门学习
开发语言·后端·学习·c#
名不经传的养虾人2 分钟前
从0到1:企业级AI项目迭代日记 Vol.30|看不见的地基:从“能用”到“可信”的30天
人工智能·ai编程·企业ai
晚烛3 分钟前
CANN 数据流与内存优化:L1/L2 缓存机制与计算重叠深度解析
人工智能·python·缓存
hef2884 分钟前
用REGEXP函数简化城市销售数据统计的实践与学习路径
学习
薛定猫AI4 分钟前
【深度解析】从 Antigravity 2.0 看 AI Agent 的产品化演进:动态子代理、项目工作区与多模型编排实战
人工智能
2的n次方_4 分钟前
健身 Agent:不止视频,更有 AI 人物实时跟练交互
人工智能·音视频·交互·魔珐星云
前端不太难4 分钟前
CPU+GPU:开启AI推理新时代
人工智能·状态模式
chian-ocean5 分钟前
创业者实操:10 分钟搭建可商业化的交互型 AI 家电导购产品
人工智能