1. 程式人生 > >核密度估計Kernel Density Estimation(KDE)

核密度估計Kernel Density Estimation(KDE)

備:密度估計相關知識

密度估計經常在統計學中作為一種基於有限的樣本來估計其概率密度函式的方法。

在研究隨機變數的過程中,隨機變數的概率密度函式的作用是描述隨機變數的特性。但是在實際應用中,總體概率密度函式通常是未知的,那麼如何來估計總體概率密度呢?一般,我們通過抽樣或者採集一定的樣本,可以根據統計學知識從樣本集合中推斷總體概率密度。這種方法統稱為概率密度估計,即根據訓練樣本來確定隨機變數的概率分佈。一般概率密度估計方法方法大致分為兩類:引數估計和非引數估計。

引數估計(Parametric Estimation)是根據對問題的經驗知識,假設問題具有某種數學模型,隨機變數服從某種分佈,即假定概率密度函式的形式,然後通過訓練資料估計出分佈函式的引數。常見的引數估計方法有最大似然方法和貝葉斯方法。對於引數估計,根據樣本中是否已知樣本所述類別將引數估計又劃分為監督引數估計和非監督引數估計

監督引數估計是由已知類別的樣本集對總體分佈的某些引數進行統計推斷。而無監督引數估計已知總體概率密度函式形式但未知樣本所屬的類別,要求推斷出概率密度函式的某些引數,這種推斷方法稱之為非監督情況下的引數估計。

非引數估計(Nonparametric Estimation)則是在已知樣本所屬的類別不假定總體分佈形式下,基於大樣本的性質,直接利用樣本估計出整個函式。在很多情況下,我們對樣本的分佈並沒有充分的瞭解,無法事先給出密度函式的形式,而且有些樣本分佈的情況也很難用簡單的函式來描述。在這種情況下,就需要用到非引數估計。但是,並不是非引數估計一定優於引數估計,因為非引數估計受訓練樣本影響,其完備性或者說是泛化能力不會很好;且這種估計只能用數值方法取得,無法得到完美的封閉函式圖形。常用的非引數估計方法有直方圖法,核概率密度估計等。

核密度估計

核密度估計Kernel Density Estimation(KDE)是在概率論中用來估計未知的密度函式,屬於非引數檢驗方法之一。



核密度的方法就是藉助一個移動的單元格(核函式)放在每一個數據點的位置上。然後將核函式的作用效果疊加起來,獲得一條光滑的曲線。而核函式的選擇條件為單個峰值下的函式面積為1

資料的標準化(normalization)是將資料按比例縮放,使之落入一個小的特定區間。資料的歸一化處理,即將資料統一對映到[0,1]區間上。

核密度估計有多種核心,在很多情況下,平滑核心(如高斯核密度估計,Gaussian Kernel Density)使用場景較多。

核密度估計

所謂核密度估計,就是採用平滑的峰值函式

(“”)來擬合觀察到的資料點,從而對真實的概率分佈曲線進行模擬。

核密度估計(Kernel densityestimation),是一種用於估計概率密度函式的非引數方法,


為獨立同分布Fn個樣本點,設其概率密度函式為f,核密度估計為以下:

//img.blog.csdn.net/20141215231909328

K(.)為核函式(非負、積分為1,符合概率密度性質,並且均值為0)。有很多種核函式,uniform,triangular,biweight, triweight, Epanechnikov,normal等。

h>0為一個平滑引數,稱作頻寬(bandwidth),也看到有人叫視窗。

Kh(x) = 1/hK(x/h). 為縮放核函式(scaledKernel)

核密度函式的原理比較簡單,在我們知道某一事物的概率分佈的情況下,如果某一個數在觀察中出現了,我們可以認為這個數的概率密度很大,和這個數比較近的數的概率密度也會比較大,而那些離這個數遠的數的概率密度會比較小。

基於這種想法,針對觀察中的第一個數,我們可以用K去擬合我們想象中的那個遠小近大概率密度。對每一個觀察數擬合出的多個概率密度分佈函式,取平均。如果某些數是比較重要的,則可以取加權平均。需要說明的一點是,核密度的估計並不是找到真正的分佈函式。

Note: 核密度估計其實就是通過核函式(如高斯)將每個資料點的資料+頻寬當作核函式的引數,得到N個核函式,再線性疊加就形成了核密度的估計函式,歸一化後就是核密度概率密度函數了

KDE演算法:索引樹

sklearn演算法實現中有一個引數是演算法項,如algorithm='auto',想了一下是為了加速。

KDE的概率密度函式公式得到後

//img.blog.csdn.net/20141215231909328

有了上述公式之後,只需遍歷輸出影象的每一個點,計算其核密度估計值即可。

但是稍微想一下就發現這個程式太冗餘了,如果有很多點(n很大),並且輸出影象很大,那麼每一個畫素都需要進行n個累積的加法運算,並且大部分都是+0(因為一般來說,一個點附近的點不會很多,遠遠小於n,其餘大部分點與這個畫素的距離都大於r),這樣就造成了冗餘計算。

解決方案當然也非常簡單,就是建立一個索引,然後在計算某個畫素的核密度估計值時利用索引搜尋出附近的點,然後累積這些點的核函式即可。

Dotspatial自帶了多種空間索引,有R樹,R*樹,KD樹等;sklearn自帶了kd tree, ball tree等等。

如果只需找出附近的點,對索引要求不高,任意一個索引都能使用。

[空間點雲核密度估計演算法的實現-Dotspatial為基礎GIS]

KDE頻寬h

如何選定核函式的方差呢?這其實是由頻寬h來決定,不同的頻寬下的核函式估計結果差異很大。

除了核函式,另一個影響KDE的引數是頻寬(h)。頻寬反映了KDE曲線整體的平坦程度,也即觀察到的資料點在KDE曲線形成過程中所佔的比重。

頻寬越大,觀察到的資料點在最終形成的曲線形狀中所佔比重越小,KDE整體曲線就越平坦;頻寬越小,觀察到的資料點在最終形成的曲線形狀中所佔比重越大,KDE整體曲線就越陡峭。