# 2.12. 密度估计
校验者:
[@不将就](https://github.com/apachecn/scikit-learn-doc-zh)
翻译者:
[@Xi](https://github.com/apachecn/scikit-learn-doc-zh)
密度估计在无监督学习,特征工程和数据建模之间划分了界线。一些最流行和最有用的密度估计方法是混合模型,如高斯混合( [`sklearn.mixture.GaussianMixture`](generated/sklearn.mixture.GaussianMixture.html#sklearn.mixture.GaussianMixture "sklearn.mixture.GaussianMixture") ), 和基于邻近的方法( [`sklearn.neighbors.KernelDensity`](generated/sklearn.neighbors.KernelDensity.html#sklearn.neighbors.KernelDensity "sklearn.neighbors.KernelDensity") ),如核密度估计。 [clustering](clustering.html#clustering) 一节中更充分地讨论了高斯混合,因为此方法也用作为一种无监督聚类方案。
密度估计是一个非常简单的概念,大多数人已经熟悉了其中一种常用的密度估计技术:直方图。
## 2.12.1. 密度估计: 直方图
直方图是一种简单的数据可视化方法,其中定义了组( bins ),并且统计了每个组( bin )中的数据点的数量。在下图的左上角中可以看到一个直方图的例子:
**[![hist_to_kde](https://box.kancloud.cn/728f8ec51c7c9c419e5645e287d780ff_566x424.jpg)](../auto_examples/neighbors/plot_kde_1d.html)**
然而,直方图的一个主要问题是组( binning )的选择可能会对得到的可视化结果造成不相称的影响。考虑上图中右上角的图, 它显示了相同数据下组( bins )向右移动后的直方图。这两个可视化的结果看起来完全不同,可能会导致对数据作出不同的解释。
直观地说,你也可以把一个直方图看成由一堆块组成,每个点上放一个块,通过在合适的网格空间中堆积这些块,我们就可以得到直方图。但是,如果不是把这些块堆叠在一个规则的网格上,而是把每个块的中心定位在它所代表的点上,然后把每个位置的总高度相加呢?这样可以得到如上图左 下角所示的可视化.它可能不像直方图那样整洁,但是由数据决定块的位置意味着它能更好地表示基本的数据。
这个可视化是核密度估计的一个例子,该例中用的是一种”顶帽”核(即每个点上的方块)。我们可以通过使用一种更平滑的核来得到一个更平滑的分布。上图右下角展示了一个高斯核密度估计,其中每个点都给总的分布贡献一条高斯曲线。结果是从数据中得到了一个平滑的密度估计,并且可作为一个强大的非参数模型用来估计这些点的分布。
## 2.12.2. 核密度估计
[`sklearn.neighbors.KernelDensity`](generated/sklearn.neighbors.KernelDensity.html#sklearn.neighbors.KernelDensity "sklearn.neighbors.KernelDensity") 实现了 scikit-learn 中的核密度估计,它使用 Ball Tree 或 KD Tree 来进行高效查询(有关这些讨论请参见 [最近邻](neighbors.html#neighbors) )。尽管为了简单起见上述示例采用的是一维数据集,但实际上核密度估计能够用在任意维度上, 不过在实际应用中,维数灾难会导致其在高维上的性能降低。
如下图所示, 从双峰分布中绘制了100个点,并展示了选用三个不同核的核密度估计:
**[![kde_1d_distribution](https://box.kancloud.cn/7873082b63775739da8176945b7e9c71_566x424.jpg)](../auto_examples/neighbors/plot_kde_1d.html)**
图中可以很明显地看到核的形状如何影响结果分布的平滑度. 使用 scikit-learn 核密度估计的方法如下所示:
```
>>> from sklearn.neighbors.kde 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](https://box.kancloud.cn/18ec89e3a6e95da43b87097fe364c599_9x13.jpg) 控制的正值函数 ![K(x;h)](https://box.kancloud.cn/0852fb21be98d922b8ee3bae4f81adc9_58x18.jpg) . 给定核的形状后,在一组点 ![x_i; i=1\cdots N](https://box.kancloud.cn/2fd55da450cea342b3291bf849216c36_106x16.jpg) 内的 ![y](https://box.kancloud.cn/0255a09d3dccb9843dcf063bbeec303f_9x12.jpg) 点处的密度估计由下式给出:
![\rho_K(y) = \sum_{i=1}^{N} K((y - x_i) / h)](https://box.kancloud.cn/44ad870e2c9bb61caf60fe59aed3f07c_208x54.jpg)
这里的带宽作为平滑参数,用来平衡结果中偏差和方差的值。 大的带宽会导致非常平滑(即高偏差)密度分布,而小的带宽则导致不平滑(即高方差)密度分布。
[`sklearn.neighbors.KernelDensity`](generated/sklearn.neighbors.KernelDensity.html#sklearn.neighbors.KernelDensity "sklearn.neighbors.KernelDensity") 实现了一些常见形状的核, 如下图所示:
**[![kde_kernels](https://box.kancloud.cn/1c8399c7360092c50b8263754bd9cc8c_566x424.jpg)](../auto_examples/neighbors/plot_kde_1d.html)**
这些核的形式如下所示:
- Gaussian kernel (`kernel = 'gaussian'`)
![K(x; h) \propto \exp(- \frac{x^2}{2h^2} )](https://box.kancloud.cn/6e0b7f56ad2972548639b80312f270fd_162x24.jpg)
- Tophat kernel (`kernel = 'tophat'`)
![K(x; h) \propto 1](https://box.kancloud.cn/29fb78f70fd47521b779f2daf0aef1c1_91x18.jpg) if ![x < h](https://box.kancloud.cn/fbd40fdefe4eb597e10fc709ccc59cb2_44x13.jpg)
- Epanechnikov kernel (`kernel = 'epanechnikov'`)
![K(x; h) \propto 1 - \frac{x^2}{h^2}](https://box.kancloud.cn/0638090fe34326dc1a8c5c3d2fcf5fa8_131x24.jpg)
- Exponential kernel (`kernel = 'exponential'`)
![K(x; h) \propto \exp(-x/h)](https://box.kancloud.cn/1c8daa6a596bd0219b0e27b89ff398e8_167x19.jpg)
- Linear kernel (`kernel = 'linear'`)
![K(x; h) \propto 1 - x/h](https://box.kancloud.cn/5d04c1fcd522abf4f58f247523b8e821_144x19.jpg) if ![x < h](https://box.kancloud.cn/fbd40fdefe4eb597e10fc709ccc59cb2_44x13.jpg)
- Cosine kernel (`kernel = 'cosine'`)
![K(x; h) \propto \cos(\frac{\pi x}{2h})](https://box.kancloud.cn/d0a330209eb2efd6508ceedb6e55b9f0_139x21.jpg) 如果 ![x < h](https://box.kancloud.cn/fbd40fdefe4eb597e10fc709ccc59cb2_44x13.jpg)
核密度估计可以与任何有效的距离度量一起使用(可用度量列表请参见 [`sklearn.neighbors.DistanceMetric`](generated/sklearn.neighbors.DistanceMetric.html#sklearn.neighbors.DistanceMetric "sklearn.neighbors.DistanceMetric") ), 但其结果被适当地归一化处理,仅适用于欧几里德度量标准。 一个特别有用的度量是测量球体上的点与点之间角距离 的 [Haversine distance](https://en.wikipedia.org/wiki/Haversine_formula) 。 下面是使用核密度估计来对地理空间数据进行可视化的示例,本例中南美大陆两种不同物种的观测分布如图:
**[](../auto_examples/neighbors/plot_species_kde.html)**
核密度估计的另一个有用的应用是从数据集中学习出一个非参数生成模型,以便有效地从该生成模型中绘制新的样本。 以下是使用此过程创建一组新的手写数字的示例,使用的是高斯核对数据的 PCA 投影进行学习:
**[![digits_kde](https://box.kancloud.cn/1c37789cab81c346b48c28c7bc3cbd4e_566x424.jpg)](../auto_examples/neighbors/plot_digits_kde_sampling.html)**
“新”数据由输入数据线性组合而成,其权重根据 KDE 模型按概率给出。
示例:
- [Simple 1D Kernel Density Estimation](../auto_examples/neighbors/plot_kde_1d.html#sphx-glr-auto-examples-neighbors-plot-kde-1d-py): 一维简单核密度估计的计算。
- [Kernel Density Estimation](../auto_examples/neighbors/plot_digits_kde_sampling.html#sphx-glr-auto-examples-neighbors-plot-digits-kde-sampling-py): 使用核密度估计来学习手写数字数据生成模型,以及使用该模型绘制新样本的示例
- [Kernel Density Estimate of Species Distributions](../auto_examples/neighbors/plot_species_kde.html#sphx-glr-auto-examples-neighbors-plot-species-kde-py): 使用Haversine距离度量来显示地理空间数据的核密度估计示例.
- scikit-learn 0.19 中文文档
- 用户指南
- 1. 监督学习
- 1.1. 广义线性模型
- 1.2. 线性和二次判别分析
- 1.3. 内核岭回归
- 1.4. 支持向量机
- 1.5. 随机梯度下降
- 1.6. 最近邻
- 1.7. 高斯过程
- 1.8. 交叉分解
- 1.9. 朴素贝叶斯
- 1.10. 决策树
- 1.11. 集成方法
- 1.12. 多类和多标签算法
- 1.13. 特征选择
- 1.14. 半监督学习
- 1.15. 等式回归
- 1.16. 概率校准
- 1.17. 神经网络模型(有监督)
- 2. 无监督学习
- 2.1. 高斯混合模型
- 2.2. 流形学习
- 2.3. 聚类
- 2.4. 双聚类
- 2.5. 分解成分中的信号(矩阵分解问题)
- 2.6. 协方差估计
- 2.7. 经验协方差
- 2.8. 收敛协方差
- 2.9. 稀疏逆协方差
- 2.10. Robust 协方差估计
- 2.11. 新奇和异常值检测
- 2.12. 密度估计
- 2.13. 神经网络模型(无监督)
- 3. 模型选择和评估
- 3.1. 交叉验证:评估估算器的表现
- 3.2. 调整估计器的超参数
- 3.3. 模型评估: 量化预测的质量
- 3.4. 模型持久化
- 3.5. 验证曲线: 绘制分数以评估模型
- 4. 数据集转换
- 4.1. Pipeline(管道)和 FeatureUnion(特征联合): 合并的评估器
- 4.2. 特征提取
- 4.3. 预处理数据
- 4.4. 无监督降维
- 4.5. 随机投影
- 4.6. 内核近似
- 4.7. 成对的矩阵, 类别和核函数
- 4.8. 预测目标 (y) 的转换
- 5. 数据集加载工具
- 6. 大规模计算的策略: 更大量的数据
- 7. 计算性能
- 教程
- 使用 scikit-learn 介绍机器学习
- 关于科学数据处理的统计学习教程
- 机器学习: scikit-learn 中的设置以及预估对象
- 监督学习:从高维观察预测输出变量
- 模型选择:选择估计量及其参数
- 无监督学习: 寻求数据表示
- 把它们放在一起
- 寻求帮助
- 处理文本数据
- 选择正确的评估器(estimator)
- 外部资源,视频和谈话