2.8. 密度估計#

密度估計介於非監督式學習、特徵工程和資料建模之間。一些最受歡迎和有用的密度估計技術是混合模型,例如高斯混合 (GaussianMixture),以及基於鄰近的方法,例如核密度估計 (KernelDensity)。高斯混合模型在分群的上下文中進行更完整的討論,因為該技術也可用作非監督式分群方案。

密度估計是一個非常簡單的概念,大多數人已經熟悉一種常見的密度估計技術:直方圖。

2.8.1. 密度估計:直方圖#

直方圖是資料的簡單視覺化,其中定義了 bin,並計算每個 bin 內的資料點數量。在下圖的左上方面板中可以看到直方圖的範例

hist_to_kde

然而,直方圖的主要問題是,bin 的選擇可能會對最終的可視化產生不成比例的影響。考慮上圖的右上方面板。它顯示了相同資料的直方圖,bin 向右移動。兩種視覺化的結果看起來完全不同,並可能導致對資料的不同解釋。

直觀地說,也可以將直方圖視為一堆區塊,每個點一個區塊。透過將區塊堆疊在適當的網格空間中,我們可以恢復直方圖。但是,如果不是將區塊堆疊在規則網格上,而是將每個區塊置於它所代表的點上,並總結每個位置的總高度呢?這個想法導致了左下的視覺化。它可能不如直方圖那樣清晰,但資料驅動區塊位置的事實意味著它是基礎資料的更好表示。

此視覺化是核密度估計的範例,在本例中使用頂帽核(即每個點的方形區塊)。我們可以透過使用更平滑的核來恢復更平滑的分佈。右下圖顯示了高斯核密度估計,其中每個點都會為總體貢獻一條高斯曲線。結果是從資料得出的平滑密度估計,並作為點分佈的強大非參數模型。

2.8.2. 核密度估計#

scikit-learn 中的核密度估計在 KernelDensity 估計器中實作,該估計器使用 Ball Tree 或 KD Tree 進行有效查詢(請參閱最近鄰居以討論這些)。雖然上面的範例為了簡單起見使用了一維資料集,但核密度估計可以在任意維度中執行,儘管在實踐中,維度的詛咒會導致其在高維度中的效能下降。

在下圖中,從雙峰分佈中抽取 100 個點,並顯示三種核選擇的核密度估計

kde_1d_distribution

很明顯,核形狀如何影響最終分佈的平滑度。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'。在數學上,核是一個正函數 \(K(x;h)\),它由頻寬參數 \(h\) 控制。給定此核形式,在一組點 \(x_i; i=1\cdots N\) 內的點 \(y\) 處的密度估計由下式給出

\[\rho_K(y) = \sum_{i=1}^{N} K(y - x_i; h)\]

此處的頻寬充當平滑參數,控制結果中偏差和變異數之間的權衡。較大的頻寬會導致非常平滑(即高偏差)的密度分佈。較小的頻寬會導致不平滑(即高變異數)的密度分佈。

參數 bandwidth 控制此平滑度。可以手動設定此參數,或使用 Scott 和 Silverman 的估計方法。

KernelDensity 實作了幾種常見的核形式,如下圖所示

kde_kernels

核的數學表達式#

這些核的形式如下

  • 高斯核 (kernel = 'gaussian')

    \(K(x; h) \propto \exp(- \frac{x^2}{2h^2} )\)

  • 頂帽核 (kernel = 'tophat')

    \(K(x; h) \propto 1\) 如果 \(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\) 如果 \(x < h\)

  • 餘弦核 (kernel = 'cosine')

    \(K(x; h) \propto \cos(\frac{\pi x}{2h})\) 如果 \(x < h\)

核密度估計器可以與任何有效距離度量一起使用(請參閱DistanceMetric以取得可用度量的列表),但結果僅針對歐幾里得度量進行適當的正規化。一個特別有用的度量是半正矢距離,它測量球體上點之間的角度距離。以下範例示範了如何使用核密度估計來視覺化地理空間資料,在本例中,視覺化了南美洲大陸上兩種不同物種的觀察分佈

species_kde

核密度估計的另一個有用的應用是學習資料集的非參數生成模型,以便有效地從此生成模型中提取新樣本。以下範例示範了如何使用此流程來建立一組新的手寫數字,該數字使用在資料的 PCA 投影上學習的高斯核

digits_kde

「新」資料由輸入資料的線性組合組成,權重是根據 KDE 模型以機率方式繪製的。

範例