机器学习&数据挖掘

核密度估计Kernel Density Estimation(KDE)

Author
宋天龙
发布于 2015-05-11
3580 次阅读
0 次赞
0 次分享
核密度估计Kernel Density Estimation(KDE)
AI 智能核心导读

核密度估计(KDE)是一种无需数据分布先验知识的非参数概率密度估计方法。它有效克服了传统参数估计的局限性及直方图平滑度差、受区间影响大等缺陷。KDE的估计精度高度依赖于核函数(如高斯核)与带宽参数的选择。该算法可通过Python的scikit-learn库高效实现,广泛应用于金融风险预测与数据聚类等场景。

深入浅出核密度估计(Kernel Density Estimation)

密度估计问题简介

在介绍核密度估计(Kernel Density Estimation, KDE)之前,先介绍下密度估计的问题。

由给定样本集合求解随机变量的分布密度函数问题,是概率统计学的基本问题之一。解决这一问题的方法主要包括参数估计非参数估计

参数估计的局限性

参数估计又可分为参数回归分析参数判别分析

  • 参数回归分析:人们假定数据分布符合某种特定的性态(如线性、可化线性或指数性态等),然后在目标函数族中寻找特定的解,即确定回归模型中的未知参数。
  • 参数判别分析:人们需要假定作为判别依据的、随机取值的数据样本在各个可能的类别中都服从特定的分布。

经验和理论说明,参数模型的这种基本假定与实际的物理模型之间常常存在较大的差距,这些方法并非总能取得令人满意的结果。

非参数估计的崛起

由于上述缺陷,Rosenblatt 和 Parzen 提出了非参数估计方法,即核密度估计方法

由于核密度估计方法不利用有关数据分布的先验知识,对数据分布不附加任何假定,是一种从数据样本本身出发研究数据分布特征的方法,因而,在统计学理论和应用领域均受到高度的重视。

一句话概括:核密度估计(KDE)是在概率论中用来估计未知的密度函数,属于非参数检验方法之一。

传统方法:直方图的局限性

在密度函数估计中,有一种被广泛应用的方法——直方图(Histogram)。如下图中的第一和第二幅图(名为 Histogram 和 Histogram, bins shifted)。直方图的特点是简单易懂,但缺点在于以下三个方面:

  1. 平滑度差:密度函数是不平滑的。
  2. 受子区间影响大:密度函数受子区间(即每个直方体)宽度影响很大。同样的原始数据如果取不同的子区间范围,那么展示的结果可能是完全不同的。如下图中的前两个图,第二个图只是在第一个图的基础上,划分区间增加了 0.75,但展现出的密度函数却看起来差异很大。
  3. 维度限制:直方图最多只能展示 2 维数据,如果维度更多则无法有效展示。

深入核密度估计(KDE)

核函数(Kernel)的选择

核密度估计有多种内核。图 3(Tophat Kernel Density)为不平滑内核,图 4(Gaussian Kernel Density, bandwidth=0.75)为平滑内核。在很多情况下,平滑内核(如高斯核密度估计,Gaussian Kernel Density)使用场景较多。

虽然采用不同的核函数都可以获得一致性的结论(整体趋势和密度分布规律性基本一致),但核密度函数也不是完美的。

带宽(Bandwidth)的影响

除了核算法的选择外,带宽(Bandwidth)也会影响密度估计。过大或过小的带宽值都会影响估计结果

如上图中的最后三个图所示,分别为不同带宽下的高斯核密度估计:Gaussian Kernel Density, bandwidth=0.75、Gaussian Kernel Density, bandwidth=0.25、Gaussian Kernel Density, bandwidth=0.55。

Python 代码实现(基于 scikit-learn)

上图为使用 Python 的 sklearn 实现,核心算法为 KernelDensity

代码示例

python
1# coding:utf-8 2import numpy as np 3import matplotlib.pyplot as plt 4from sklearn.neighbors import KernelDensity 5 6np.random.seed(1) 7N = 20 8X = np.concatenate((np.random.normal(0, 1, 0.3 * N), 9 np.random.normal(5, 1, 0.7 * N)))[:, np.newaxis] 10X_plot = np.linspace(-5, 10, 1000)[:, np.newaxis] 11bins = np.linspace(-5, 10, 10) 12 13fig, ax = plt.subplots(2, 2, sharex=True, sharey=True) 14fig.subplots_adjust(hspace=0.05, wspace=0.05) 15 16# 直方图 1 'Histogram' 17ax[0, 0].hist(X[:, 0], bins=bins, fc='#AAAAFF', normed=True) 18ax[0, 0].text(-3.5, 0.31, 'Histogram') 19 20# 直方图 2 'Histogram, bins shifted' 21ax[0, 1].hist(X[:, 0], bins=bins + 0.75, fc='#AAAAFF', normed=True) 22ax[0, 1].text(-3.5, 0.31, 'Histogram, bins shifted') 23 24# 核密度估计 1 'tophat KDE' 25kde = KernelDensity(kernel='tophat', bandwidth=0.75).fit(X) 26log_dens = kde.score_samples(X_plot) 27ax[1, 0].fill(X_plot[:, 0], np.exp(log_dens), fc='#AAAAFF') 28ax[1, 0].text(-3.5, 0.31, 'Tophat Kernel Density') 29 30# 核密度估计 2 'Gaussian KDE' 31kde = KernelDensity(kernel='gaussian', bandwidth=0.75).fit(X) 32log_dens = kde.score_samples(X_plot) 33ax[1, 1].fill(X_plot[:, 0], np.exp(log_dens), fc='#AAAAFF') 34ax[1, 1].text(-3.5, 0.31, 'Gaussian Kernel Density') 35 36for axi in ax.ravel(): 37 axi.plot(X[:, 0], np.zeros(X.shape[0]) - 0.01, '+k') 38 axi.set_xlim(-4, 9) 39 axi.set_ylim(-0.02, 0.34) 40 41for axi in ax[:, 0]: 42 axi.set_ylabel('Normalized Density') 43 44for axi in ax[1, :]: 45 axi.set_xlabel('x') 46 47plt.show()

核心参数解析

KernelDensity 算法底层包括 kd_treeball_tree,默认自动选择。核模型包括 gaussiantophatepanechnikovexponentiallinearcosine,默认是 gaussian 模型。

可调整的类参数如下:

python
1class sklearn.neighbors.KernelDensity(bandwidth=1.0, algorithm='auto', kernel='gaussian', metric='euclidean', atol=0, rtol=0, breadth_first=True, leaf_size=40, metric_params=None)

应用场景与总结

核密度估计的应用场景

  • 股票、金融等风险预测。

尾巴:密度估计中应用较多的算法是高斯混合模型以及基于近邻的核密度估计。其中,高斯混合核密度估计模型更多会在聚类场景中应用。

分享
最后修订: 2015-05-11