1. 程式人生 > >核密度估計(kernel density estimation)

核密度估計(kernel density estimation)

有一些資料,想“看看”它長什麼樣,我們一般會畫直方圖(Histogram)。現在你也可以用核密度估計。

#什麼是“核”

如果不瞭解背景,看到“核密度估計”這個概念基本上就是一臉懵逼。我們先說說這個核 (kernel) 是什麼。

首先,“核”在不同的語境下的含義是不同的,例如在模式識別裡,它的含義就和這裡不同。在“非引數估計”的語境下,“核”是一個函式,用來提供權重。例如高斯函式 (Gaussian) 就是一個常用的核函式。

讓我們舉個例子,假設我們現在想買房,錢不夠要找親戚朋友借,我們用一個數組來表示 5 個親戚的財產狀況: [8, 2, 5, 6, 4]。我們是中間這個數 5。“核”可以類比 成朋友圈,但不同的親戚朋友親疏有別,在借錢的時候,關係好的朋友出力多,關係不好的朋友出力少,於是我們可以用權重來表示。總共能借到的錢是: 8*0.1 + 2*0.4 + 5 + 6*0.3 + 4*0.2 = 9.2

那麼“核”的作用就是用來決定權重,例如高斯函式(即正態分佈):

Kernel Exponential

如果還套用上面的例子的話,可以認為在 3 代血親之外的親戚就基本不會借錢給你了。

最後呢,一般要求核函式有下面兩個性質:

  • 歸一化:$\int_{- \infty}^{+ \infty}{K(u) du} = 1$
  • 對稱性:對所有 $u$ 要求 $K(-u) = K(u)$

#核密度估計

理解了“核”,核密度估計就容易理解了。

如果我們畫直方圖,其實目的是畫出“概率密度函式”,而直方圖本質上是認為頻率等於概率。但這種假設不是必然的。核密度函式就是一種“平滑(smooth)”的手段。相當於是“我說我很牛逼你可能不信,但你可以聽聽我的朋友們是怎麼評價我的,加權平均下就能更好地瞭解我了”。於是乎:

設 $(x_1, x_2, …, x_n)$ 是獨立同分布的 n 個樣本點,它的概率密度函式是 $f$,於是我們的估計:

$$\hat{f_h}(x) = \frac{1}{n}\sum_{i=1}^{n}{K_h(x - x_i)} = \frac{1}{nh}\sum_{i=1}^{n}{K(\frac{x-x_i}{h})}$$

上面式子中 h 是人為指定的,代表“朋友圈”的大小,正式的叫法是“頻寬”(bandwidth) 。而 $x-x_i$ 就是自己與朋友的親疏程度,當然最後要正歸化到 [-1, 1] 之間。下圖是直方圖和核密度估計的一個對比:

Comparison_of_1D_histogram_and_KDE

#選擇合適的頻寬

選擇不同的頻寬,核密度估計的結果也大不相同,因此人們研究了一些演算法來選擇頻寬。這方面對理解 KDE 本身沒有什麼太重要的意義,並且常見的演算法在 scipy 裡也已經都實現了,這裡就不細說了,有興趣的看看

wiki 吧。

#參考