scikit-learn 密度估計(jì)

2023-02-20 13:45 更新

密度估計(jì)涉及到無監(jiān)督學(xué)習(xí),特征工程和數(shù)據(jù)建模三個(gè)領(lǐng)域。一些最流行和有用的密度估計(jì)技術(shù)是混合模型(例如高斯混合模型sklearn.mixture.GaussianMixture)和基于近鄰域的方法(例如核密度估計(jì)sklearn.neighbors.KernelDensity)。高斯混合在聚類的一節(jié)中進(jìn)行了更全面的討論 ,因?yàn)樵摷夹g(shù)還可用作無監(jiān)督聚類方案。

密度估計(jì)是一個(gè)非常簡(jiǎn)單的概念,大多數(shù)人已經(jīng)熟悉了一種常見的密度估計(jì)技術(shù):直方圖。

2.8.1. 密度估計(jì): 直方圖

直方圖是一種簡(jiǎn)單的數(shù)據(jù)可視化,其中定義了bin,并統(tǒng)計(jì)每個(gè)bin中的數(shù)據(jù)點(diǎn)數(shù)量。直方圖的一個(gè)例子可以在下圖的左上面板中看到:


然而,直方圖的一個(gè)主要問題是分組的選擇可能會(huì)對(duì)結(jié)果的可視化產(chǎn)生不成比例的影響。相同數(shù)據(jù)下,右上角的圖是左上角的圖向右移動(dòng)后產(chǎn)生的。兩種可視化的結(jié)果看起來完全不同,可能會(huì)導(dǎo)致對(duì)數(shù)據(jù)不同的解釋。

直觀地說,我們也可以把直方圖看成一堆塊,每個(gè)點(diǎn)上放一個(gè)塊。通過在適當(dāng)?shù)木W(wǎng)格空間中疊加這些塊,我們就可以恢復(fù)直方圖。但是,如果我們不是將這些塊堆積在一個(gè)規(guī)則的網(wǎng)格上,而是將每個(gè)塊集中在它所代表的點(diǎn)上,并將每個(gè)位置的總高度加起來呢?這樣就得到了上圖左下角所示的可視化。它可能不像直方圖那樣整潔,但是由數(shù)據(jù)決定塊的位置意味著它能更好地表示底層的數(shù)據(jù)。

這個(gè)可視化是核密度估計(jì)的一個(gè)示例,在這個(gè)例子中使用了一種頂帽核(即每個(gè)點(diǎn)上放一個(gè)方形塊)。我們可以通過使用一種更平滑的核來得到一個(gè)更平滑的分布。右下角的圖展示了一個(gè)高斯核密度估計(jì)值,其中每個(gè)點(diǎn)都給總分布貢獻(xiàn)一條高斯曲線。結(jié)果是從數(shù)據(jù)中得出一個(gè)平滑的密度估計(jì),并且可作為一個(gè)強(qiáng)大的非參數(shù)的點(diǎn)分布模型。

2.8.2. 核密度估計(jì)

scikit-learn中的核密度估計(jì)是在sklearn.neighbors.KernelDensity估計(jì)器中實(shí)現(xiàn)的,該估計(jì)器使用Ball Tree或KD Tree進(jìn)行高效查詢(有關(guān)這些內(nèi)容的討論,請(qǐng)參閱最近鄰)。盡管為簡(jiǎn)化起見,上面的示例使用一維數(shù)據(jù)集,但是可以在任意多個(gè)維度上執(zhí)行核密度估計(jì),不過在實(shí)踐中,維度災(zāi)難會(huì)導(dǎo)致其性能在高維度上下降。

在下圖中, 從雙峰分布中繪制了100個(gè)點(diǎn),并顯示了選用三個(gè)不同核的核密度估計(jì):


很明顯,核形狀如何影響結(jié)果分布的平滑度。scikit-learn核密度估計(jì)器可以按以下方式使用:

>>> 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'。從數(shù)學(xué)上講,核是一個(gè)正值函數(shù)由帶寬參數(shù) 控制。給定核的形狀后,在一組點(diǎn) 內(nèi)的 點(diǎn)處的密度估計(jì)由下式給出

這里的帶寬作為一個(gè)平滑參數(shù),控制結(jié)果中偏差和方差之間的權(quán)衡。大帶寬導(dǎo)致非常平滑(即高偏差)的密度分布。小帶寬導(dǎo)致不平滑(即高方差)的密度分布。

sklearn.neighbors.KernelDensity 實(shí)現(xiàn)幾種常見形狀的的核,如下圖所示:


這些核的形狀如下所示:

  • Gaussian kernel ( kernel = 'gaussian' )

  • Tophat kernel ( kernel = 'tophat' ) if $x

  • Epanechnikov kernel ( kernel = 'epanechnikov' )

  • Exponential kernel ( kernel = 'exponential' )

  • Linear kernel ( kernel = ' linear' ) if $x

  • cosine kernel ( kernel = 'cosine' ) 如果 $x

核密度估計(jì)可以與任何有效的距離度量一起使用(有關(guān)可用指標(biāo)的列表,請(qǐng)參見 sklearn.neighbors.DistanceMetric ), 盡管結(jié)果只針對(duì)歐氏度量進(jìn)行適當(dāng)?shù)貧w一化。 一個(gè)特別有用的度量是 Haversine distance ,它測(cè)量球體上的點(diǎn)與點(diǎn)之間角距離。 這里有一個(gè)使用核密度估計(jì)來可視化地理空間數(shù)據(jù)的例子,在這種情況下,南美大陸上兩個(gè)不同物種的觀測(cè)分布:


核密度估計(jì)的另一個(gè)有用的應(yīng)用是從數(shù)據(jù)集中學(xué)習(xí)出一個(gè)非參數(shù)生成模型,以便有效地從該生成模型中繪制新的樣本。這是一個(gè)示例,該示例使用高斯核對(duì)數(shù)據(jù)的 PCA 投影進(jìn)行學(xué)習(xí),創(chuàng)建一組新的手寫數(shù)字的示例,:


“新”數(shù)據(jù)由輸入數(shù)據(jù)線性組合而成,其權(quán)重根據(jù) KDE 模型按概率給出。

示例:


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)