# 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 )中的數據點的數量。在下圖的左上角中可以看到一個直方圖的例子:
**[](../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個點,并展示了選用三個不同核的核密度估計:
**[](../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'` .在數學上,核是由帶寬參數  控制的正值函數  . 給定核的形狀后,在一組點  內的  點處的密度估計由下式給出:

這里的帶寬作為平滑參數,用來平衡結果中偏差和方差的值。 大的帶寬會導致非常平滑(即高偏差)密度分布,而小的帶寬則導致不平滑(即高方差)密度分布。
[`sklearn.neighbors.KernelDensity`](generated/sklearn.neighbors.KernelDensity.html#sklearn.neighbors.KernelDensity "sklearn.neighbors.KernelDensity") 實現了一些常見形狀的核, 如下圖所示:
**[](../auto_examples/neighbors/plot_kde_1d.html)**
這些核的形式如下所示:
- Gaussian kernel (`kernel = 'gaussian'`)

- Tophat kernel (`kernel = 'tophat'`)
 if 
- Epanechnikov kernel (`kernel = 'epanechnikov'`)

- Exponential kernel (`kernel = 'exponential'`)

- Linear kernel (`kernel = 'linear'`)
 if 
- Cosine kernel (`kernel = 'cosine'`)
 如果 
核密度估計可以與任何有效的距離度量一起使用(可用度量列表請參見 [`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 投影進行學習:
**[](../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)
- 外部資源,視頻和談話