前天和導師開會的時候,我給導師看了我plot出的一張圖,如下。導師問我,圖里的Y軸是什么意思。我的回答很模糊,說這是經過KDE,kernel density estimation計算后的值,大概代表着數據密度,來表達數據分布,但是具體的值我並不清楚。
KDE的原理
今天我就研究了下,KDE的計算具體是怎樣。
這里以高斯kernel為例。KDE對於數據里的每一個點,都畫作一個高斯分布的波。然后對波進行疊加,於是數據密集的地方,波的高度就越高,數據越稀疏的地方,波就相對矮,數據分布的就一目了然。
那么,Y軸的值具體上又代表着什么呢?
我們知道在matplotlib.pyplot.hist里,y軸為數據在某一個范圍里出現的頻次。Seaborn.distplot卻不同,有2個參數的默認值為True,分別為kde=True和norm_hist=True. 原來,distplot對數據的進行了歸一化處理。我們來看看當kde與norm_hist為False時的情況,並對比下matplotlib.pyplt.hist。
可以看到,當kde與norm_hist皆為Fasle時,它的plot與matplotlib.pyplot.hist是一模一樣的。表現出的是頻次。
Seaborn文檔介紹如下:當參數為True時,直方圖的高度以密度而不是頻次來表示,它是kde的必要條件。
norm_hist : bool, optional
If True, the histogram height shows a density rather than a count. This is implied if a KDE or fitted density is plotted.
然而,我們現在知道了Y軸表達密度,還是無法確切的知道具體的值能用來計算什么。其實,就像其他的概率分布圖,它也是用來計算概率的。
在KDE圖里,我們的y軸並不直接表達概率,我們需要計算的是曲線下方的面積。這個面積在直方圖里就是寬度乘以高度。比如在上圖,最左邊的方塊寬度約為0.1,范圍從1.5-1.6,高度為0.8。那么數據分布在這里的概率就是0.1*0.8 = 0.08。
這就是Seaborn.distplot里Y軸高度的含義了,感謝閱讀。