在数据建模和工程领域,密度估计技术扮演着重要角色。其中,高斯混合模型(Gaussian Mixtures)和基于邻近的方法如核密度估计(Kernel Density)是两种非常流行且实用的技术。高斯混合模型不仅在密度估计中发挥作用,还常被用于无监督的聚类分析。
密度估计的概念其实非常简单,许多人可能已经熟悉其中一种常见的密度估计技术:直方图。直方图通过定义不同的区间(bins),并统计每个区间内的数据点数量来进行数据的可视化。然而,直方图的一个主要问题是区间划分的选择可能会对最终的可视化结果产生不成比例的影响。例如,如果将区间向右移动,即使数据相同,得到的可视化结果可能会截然不同,从而可能导致对数据的不同解释。
直方图可以被看作是一堆堆叠在一起的块,每个块代表一个数据点。如果不将这些块堆叠在规则的网格上,而是将每个块的中心放在它所代表的点上,并在每个位置累加总高度,就会得到一个不同的可视化效果。虽然这种效果可能不如直方图那样清晰,但由于数据驱动了块的位置,因此它更能准确地表示底层数据。
这种可视化是一个核密度估计的例子,在这个例子中使用了平顶核(即在每个点上使用一个正方形块)。可以通过使用更平滑的核来恢复一个更平滑的分布。下图显示了使用高斯核的密度估计,其中每个点都贡献了一个高斯曲线。结果是从数据中派生出来的平滑密度估计,作为一个强大的非参数模型,用于描述点的分布。
在scikit-learn中,核密度估计通过KernelDensity估计器实现,该估计器使用Ball Tree或KD Tree进行高效的查询。虽然上述例子为了简单起见使用了一维数据集,但核密度估计可以在任何数量的维度上执行,尽管在高维度上,维度的诅咒会导致其性能下降。
下图显示了从双峰分布中抽取的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)
在这个例子中,使用了高斯核。数学上,核是一个正函数K(x;h),由带宽参数h控制。给定这种核形式,点y在一组点x_i; i=1...N中的密度估计由以下公式给出:
rho_K(y) = sum[i=1 to N] K(y - x_i; h)
这里的带宽作为一个平滑参数,控制结果中的偏差和方差之间的权衡。大的带宽会导致非常平滑(即高偏差)的密度分布。小的带宽会导致不平滑(即高方差)的密度分布。带宽参数控制这种平滑。人们可以手动设置这个参数,或者使用Scott和Silverman的估计方法。
KernelDensity实现了几种常见的核形式,如下所示。这些核的数学表达式如下:
核密度估计器可以使用任何有效的距离度量(见DistanceMetric了解可用度量列表),尽管结果仅在欧几里得度量下被正确归一化。一个特别有用的度量是Haversine距离,它测量球面上点之间的角距离。下面是一个使用核密度估计来可视化地理空间数据的例子,在这个例子中,展示了南美洲大陆上两种不同物种的观测分布。