2.8. 密度估计

密度估计涉及到无监督学习,特征工程和数据建模三个领域。一些最流行和有用的密度估计技术是混合模型(例如高斯混合模型sklearn.mixture.GaussianMixture)和基于近邻域的方法(例如核密度估计sklearn.neighbors.KernelDensity)。高斯混合在聚类的一节中进行了更全面的讨论 ,因为该技术还可用作无监督聚类方案。

密度估计是一个非常简单的概念,大多数人已经熟悉了一种常见的密度估计技术:直方图。

2.8.1. 密度估计: 直方图

直方图是一种简单的数据可视化,其中定义了bin,并统计每个bin中的数据点数量。直方图的一个例子可以在下图的左上面板中看到:

然而,直方图的一个主要问题是分组的选择可能会对结果的可视化产生不成比例的影响。相同数据下,右上角的图是左上角的图向右移动后产生的。两种可视化的结果看起来完全不同,可能会导致对数据不同的解释。

直观地说,我们也可以把直方图看成一堆块,每个点上放一个块。通过在适当的网格空间中叠加这些块,我们就可以恢复直方图。但是,如果我们不是将这些块堆积在一个规则的网格上,而是将每个块集中在它所代表的点上,并将每个位置的总高度加起来呢?这样就得到了上图左下角所示的可视化。它可能不像直方图那样整洁,但是由数据决定块的位置意味着它能更好地表示底层的数据。

这个可视化是核密度估计的一个示例,在这个例子中使用了一种顶帽核(即每个点上放一个方形块)。我们可以通过使用一种更平滑的核来得到一个更平滑的分布。右下角的图展示了一个高斯核密度估计值,其中每个点都给总分布贡献一条高斯曲线。结果是从数据中得出一个平滑的密度估计,并且可作为一个强大的非参数的点分布模型。

2.8.2. 核密度估计

scikit-learn中的核密度估计是在sklearn.neighbors.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], [11], [21], [32]])
>>> 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'。从数学上讲,核是一个正值函数由带宽参数 控制。给定核的形状后,在一组点 内的 点处的密度估计由下式给出

这里的带宽作为一个平滑参数,控制结果中偏差和方差之间的权衡。大带宽导致非常平滑(即高偏差)的密度分布。小带宽导致不平滑(即高方差)的密度分布。

sklearn.neighbors.KernelDensity 实现几种常见形状的的核,如下图所示:

这些核的形状如下所示:

  • Gaussian kernel ( kernel = 'gaussian' )

  • Tophat kernel ( kernel = 'tophat' ) if $x

  • Epanechnikov kernel ( kernel = 'epanechnikov' )

  • Exponential kernel ( kernel = 'exponential' )

  • Linear kernel ( kernel = ' linear' ) if $x

  • cosine kernel ( kernel = 'cosine' ) 如果 $x

核密度估计可以与任何有效的距离度量一起使用(有关可用指标的列表,请参见 sklearn.neighbors.DistanceMetric ), 尽管结果只针对欧氏度量进行适当地归一化。 一个特别有用的度量是 Haversine distance ,它测量球体上的点与点之间角距离。 这里有一个使用核密度估计来可视化地理空间数据的例子,在这种情况下,南美大陆上两个不同物种的观测分布:

核密度估计的另一个有用的应用是从数据集中学习出一个非参数生成模型,以便有效地从该生成模型中绘制新的样本。这是一个示例,该示例使用高斯核对数据的 PCA 投影进行学习,创建一组新的手写数字的示例,:

“新”数据由输入数据线性组合而成,其权重根据 KDE 模型按概率给出。

示例: