中文文檔: 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 )中的資料點的數量。在下圖的左上角中可以看到一個直方圖的例子:
然而,直方圖的一個主要問題是組( binning )的選擇可能會對得到的可視化結果造成不相稱的影響。考慮上圖中右上角的圖, 它顯示了相同資料下組( bins )向右移動後的直方圖。這兩個可視化的結果看起來完全不同,可能會導緻對資料作出不同的解釋。
直覺地說,你也可以把一個直方圖看成由一堆塊組成,每個點上放一個塊,通過在合适的網格空間中堆積這些塊,我們就可以得到直方圖。但是,如果不是把這些塊堆疊在一個規則的網格上,而是把每個塊的中心定位在它所代表的點上,然後把每個位置的總高度相加呢?這樣可以得到如上圖左 下角所示的可視化.它可能不像直方圖那樣整潔,但是由資料決定塊的位置意味着它能更好地表示基本的資料。
這個可視化是核密度估計的一個例子,該例中用的是一種”頂帽”核(即每個點上的方塊)。我們可以通過使用一種更平滑的核來得到一個更平滑的分布。上圖右下角展示了一個高斯核密度估計,其中每個點都給總的分布貢獻一條高斯曲線。結果是從資料中得到了一個平滑的密度估計,并且可作為一個強大的非參數模型用來估計這些點的分布。
2.12.2. 核密度估計
sklearn.neighbors.KernelDensity
實作了 scikit-learn 中的核密度估計,它使用 Ball Tree 或 KD Tree 來進行高效查詢(有關這些讨論請參見 最近鄰 )。盡管為了簡單起見上述示例采用的是一維資料集,但實際上核密度估計能夠用在任意次元上, 不過在實際應用中,維數災難會導緻其在高維上的性能降低。
如下圖所示, 從雙峰分布中繪制了100個點,并展示了選用三個不同核的核密度估計:
圖中可以很明顯地看到核的形狀如何影響結果分布的平滑度. 使用 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
實作了一些常見形狀的核, 如下圖所示:
這些核的形式如下所示:
- Gaussian kernel (
)kernel = 'gaussian'
- Tophat kernel (
) ifkernel = 'tophat'
- Epanechnikov kernel (
)kernel = 'epanechnikov'
- Exponential kernel (
)kernel = 'exponential'
- Linear kernel (
) ifkernel = 'linear'
- Cosine kernel (
) 如果kernel = 'cosine'
核密度估計可以與任何有效的距離度量一起使用(可用度量清單請參見
sklearn.neighbors.DistanceMetric
), 但其結果被适當地歸一化處理,僅适用于歐幾裡德度量标準。 一個特别有用的度量是測量球體上的點與點之間角距離 的 Haversine distance 。 下面是使用核密度估計來對地理空間資料進行可視化的示例,本例中南美大陸兩種不同物種的觀測分布如圖:
核密度估計的另一個有用的應用是從資料集中學習出一個非參數生成模型,以便有效地從該生成模型中繪制新的樣本。 以下是使用此過程建立一組新的手寫數字的示例,使用的是高斯核對資料的 PCA 投影進行學習:
“新”資料由輸入資料線性組合而成,其權重根據 KDE 模型按機率給出。
示例:
- Simple 1D Kernel Density Estimation: 一維簡單核密度估計的計算。
- Kernel Density Estimation: 使用核密度估計來學習手寫數字資料生成模型,以及使用該模型繪制新樣本的示例
- Kernel Density Estimate of Species Distributions: 使用Haversine距離度量來顯示地理空間資料的核密度估計示例.
中文文檔: 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