scikit-learn 中文文檔-密度估計-無監督學習|ApacheCN

中文文檔: http://sklearn.apachecn.org/cn/stable/modules/density.html

英文文檔: http://sklearn.apachecn.org/cn/stable/modules/density.html

官方文檔: http://scikit-learn.org/stable/

GitHub: https://github.com/apachecn/scikit-learn-doc-zh(覺得不錯麻煩給個 Star,我們一直在努力)

貢獻者: https://github.com/apachecn/scikit-learn-doc-zh#貢獻者

關於我們: http://www.apachecn.org/organization/209.html




2.12. 密度估計

密度估計在無監督學習,特徵工程和數據建模之間劃分了界線。一些最流行和最有用的密度估計方法是混合模型,如高斯混合( sklearn.mixture.GaussianMixture ), 和基於鄰近的方法( sklearn.neighbors.KernelDensity ),如核密度估計。 clustering 一節中更充分地討論了高斯混合,因爲此方法也用作爲一種無監督聚類方案。

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

2.12.1. 密度估計: 直方圖

直方圖是一種簡單的數據可視化方法,其中定義了組( bins ),並且統計了每個組( bin )中的數據點的數量。在下圖的左上角中可以看到一個直方圖的例子:

hist_to_kde

然而,直方圖的一個主要問題是組( binning )的選擇可能會對得到的可視化結果造成不相稱的影響。考慮上圖中右上角的圖, 它顯示了相同數據下組( bins )向右移動後的直方圖。這兩個可視化的結果看起來完全不同,可能會導致對數據作出不同的解釋。

直觀地說,你也可以把一個直方圖看成由一堆塊組成,每個點上放一個塊,通過在合適的網格空間中堆積這些塊,我們就可以得到直方圖。但是,如果不是把這些塊堆疊在一個規則的網格上,而是把每個塊的中心定位在它所代表的點上,然後把每個位置的總高度相加呢?這樣可以得到如上圖左 下角所示的可視化.它可能不像直方圖那樣整潔,但是由數據決定塊的位置意味着它能更好地表示基本的數據。

這個可視化是核密度估計的一個例子,該例中用的是一種”頂帽”核(即每個點上的方塊)。我們可以通過使用一種更平滑的核來得到一個更平滑的分佈。上圖右下角展示了一個高斯核密度估計,其中每個點都給總的分佈貢獻一條高斯曲線。結果是從數據中得到了一個平滑的密度估計,並且可作爲一個強大的非參數模型用來估計這些點的分佈。

2.12.2. 核密度估計

sklearn.neighbors.KernelDensity 實現了 scikit-learn 中的核密度估計,它使用 Ball Tree 或 KD Tree 來進行高效查詢(有關這些討論請參見 最近鄰 )。儘管爲了簡單起見上述示例採用的是一維數據集,但實際上核密度估計能夠用在任意維度上, 不過在實際應用中,維數災難會導致其在高維上的性能降低。

如下圖所示, 從雙峯分佈中繪製了100個點,並展示了選用三個不同核的核密度估計:

kde_1d_distribution

圖中可以很明顯地看到核的形狀如何影響結果分佈的平滑度. 使用 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 控制的正值函數 K(x;h) . 給定核的形狀後,在一組點 x_i; i=1\cdots N 內的 y 點處的密度估計由下式給出:

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

這裏的帶寬作爲平滑參數,用來平衡結果中偏差和方差的值。 大的帶寬會導致非常平滑(即高偏差)密度分佈,而小的帶寬則導致不平滑(即高方差)密度分佈。

sklearn.neighbors.KernelDensity 實現了一些常見形狀的核, 如下圖所示:

kde_kernels

這些核的形式如下所示:

  • Gaussian kernel (kernel = 'gaussian')

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

  • Tophat kernel (kernel = 'tophat')

    K(x; h) \propto 1 if x < h

  • Epanechnikov kernel (kernel = 'epanechnikov')

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

  • Exponential kernel (kernel = 'exponential')

    K(x; h) \propto \exp(-x/h)

  • Linear kernel (kernel = 'linear')

    K(x; h) \propto 1 - x/h if x < h

  • Cosine kernel (kernel = 'cosine')

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

核密度估計可以與任何有效的距離度量一起使用(可用度量列表請參見 sklearn.neighbors.DistanceMetric ), 但其結果被適當地歸一化處理,僅適用於歐幾里德度量標準。 一個特別有用的度量是測量球體上的點與點之間角距離 的 Haversine distance 。 下面是使用核密度估計來對地理空間數據進行可視化的示例,本例中南美大陸兩種不同物種的觀測分佈如圖:

species_kde

核密度估計的另一個有用的應用是從數據集中學習出一個非參數生成模型,以便有效地從該生成模型中繪製新的樣本。 以下是使用此過程創建一組新的手寫數字的示例,使用的是高斯覈對數據的 PCA 投影進行學習:

digits_kde

“新”數據由輸入數據線性組合而成,其權重根據 KDE 模型按概率給出。

示例:




中文文檔: http://sklearn.apachecn.org/cn/stable/modules/density.html

英文文檔: http://sklearn.apachecn.org/cn/stable/modules/density.html

官方文檔: http://scikit-learn.org/stable/

GitHub: https://github.com/apachecn/scikit-learn-doc-zh(覺得不錯麻煩給個 Star,我們一直在努力)

貢獻者: https://github.com/apachecn/scikit-learn-doc-zh#貢獻者

關於我們: http://www.apachecn.org/organization/209.html

有興趣的們也可以和我們一起來維護,持續更新中 。。。

機器學習交流羣: 629470233


發佈了1 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章