2.8. 密度估计#
密度估计介于无监督学习、特征工程和数据建模之间。一些最流行和最有用的密度估计技术是混合模型,例如高斯混合 (GaussianMixture),以及基于邻近的方法,例如核密度估计 (KernelDensity)。高斯混合在聚类的背景下得到了更充分的讨论,因为该技术也可用作无监督聚类方案。
密度估计是一个非常简单的概念,大多数人已经熟悉一种常见的密度估计技术:直方图。
2.8.1. 密度估计:直方图#
直方图是一种简单的数据可视化方式,其中定义了数据区间(bins),并对每个区间内的数据点数量进行统计。直方图的示例可以在下图的左上角面板中看到
然而,直方图的一个主要问题是,区间的选择对最终的可视化结果可能产生不成比例的影响。考虑上图的右上角面板。它显示了相同数据的直方图,但区间向右平移。两个可视化的结果看起来完全不同,可能会导致对数据的不同解释。
直观地看,也可以将直方图想象成一堆积木,每个点对应一块积木。通过将积木堆叠在适当的网格空间中,我们得到了直方图。但是,如果我们不将积木堆叠在规则网格上,而是将每块积木以其代表的点为中心放置,并对每个位置的总高度求和呢?这种想法导致了左下角的可视化。它可能不如直方图清晰,但数据驱动积木位置的事实意味着它能更好地表示底层数据。
这种可视化是核密度估计的一个例子,在这种情况下使用了一个平顶核(top-hat kernel)(即在每个点上有一个正方形积木)。通过使用更平滑的核,我们可以得到一个更平滑的分布。右下角的图显示了一个高斯核密度估计,其中每个点都为总和贡献了一条高斯曲线。结果是一个平滑的密度估计,它源于数据,并作为一个强大的非参数模型来描述点的分布。
2.8.2. 核密度估计#
scikit-learn 中的核密度估计由 KernelDensity 估计器实现,它使用 Ball Tree 或 KD Tree 进行高效查询(有关这些的讨论,请参阅最近邻居)。尽管上面的示例为了简单起见使用了 1D 数据集,但核密度估计可以在任意数量的维度中执行,尽管在实践中,维度灾难会导致其性能在高维度中下降。
在下图中,从双峰分布中抽取了 100 个点,并显示了三种不同核选择下的核密度估计
很明显,核形状如何影响所得分布的平滑度。scikit-learn 核密度估计器可以按如下方式使用
>>> from sklearn.neighbors import KernelDensity
>>> import numpy as np
>>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
>>> kde = KernelDensity(kernel='gaussian', bandwidth=0.2).fit(X)
>>> kde.score_samples(X)
array([-0.41075698, -0.41075698, -0.41076071, -0.41075698, -0.41075698,
-0.41076071])
这里我们使用了 kernel='gaussian',如上所示。在数学上,核是一个由带宽参数 \(h\) 控制的正函数 \(K(x;h)\)。给定这种核形式,点组 \(x_i; i=1, \cdots, N\) 中某一点 \(y\) 的密度估计由下式给出
这里的带宽充当平滑参数,控制结果中偏差和方差之间的权衡。大带宽会导致非常平滑(即高偏差)的密度分布。小带宽会导致不平滑(即高方差)的密度分布。
参数 bandwidth 控制这种平滑度。可以手动设置此参数,也可以使用 Scott 和 Silverman 的估计方法。
KernelDensity 实现了几种常见的核形式,如下图所示
核的数学表达式#
这些核的形式如下
高斯核 (
kernel = 'gaussian')\(K(x; h) \propto \exp(- \frac{x^2}{2h^2} )\)
平顶核 (
kernel = 'tophat')\(K(x; h) \propto 1\) if \(x < h\)
Epanechnikov 核 (
kernel = 'epanechnikov')\(K(x; h) \propto 1 - \frac{x^2}{h^2}\)
指数核 (
kernel = 'exponential')\(K(x; h) \propto \exp(-x/h)\)
线性核 (
kernel = 'linear')\(K(x; h) \propto 1 - x/h\) if \(x < h\)
余弦核 (
kernel = 'cosine')\(K(x; h) \propto \cos(\frac{\pi x}{2h})\) if \(x < h\)
核密度估计器可以与任何有效的距离度量一起使用(有关可用度量列表,请参阅 DistanceMetric),尽管结果仅针对欧几里得度量进行了适当归一化。一个特别有用的度量是 Haversine 距离,它测量球体上点之间的角距离。这是一个使用核密度估计可视化地理空间数据的示例,在这种情况下是南美洲大陆上两种不同物种的观测分布
核密度估计的另一个有用应用是学习数据集的非参数生成模型,以便有效地从该生成模型中抽取新样本。这是一个使用此过程创建一组新手写数字的示例,使用了在高斯核在数据的 PCA 投影上学习的模型
“新”数据由输入数据的线性组合组成,权重根据 KDE 模型概率性抽取。
示例
简单的一维核密度估计:计算一维中的简单核密度估计。
核密度估计:使用核密度估计学习手写数字数据的生成模型,并从该模型中抽取新样本的示例。
物种分布的核密度估计:使用 Haversine 距离度量可视化地理空间数据的核密度估计示例




