2014-09-05 168 views
2

下面的兩個地塊傳達大致相同的信息。密度與頻率

  • 左邊的一個是直方圖,其中Y軸表示頻率(即如何經常我們看到與每個容器相關聯的範圍內的值)。

  • 右邊的是密度(KDE估計)。 Y軸表示密度(積分應該合計爲1)。

我通常喜歡密度圖(你可以調整,但Y軸通常是難以解釋的。

我知道KDE估計將返回的密度增加了1假設域的可變跨度從-Inf到Inf,但是有什麼辦法可以將從KDE估計產生的PDF映射到頻率(例如,按比例增大值以獲得頻率)?

這只是「縮放」軸?或者是否還有其他涉及?

      density vs frequency

+0

我沒有在matplotlib使用密度圖前;但是,您可以實現類似於轉換或twinx()所描述的內容 - 請參閱http://matplotlib.org/examples/api/two_scales.html(http://matplotlib.org/examples/) api/two_scales.html) – Maximus 2014-09-05 11:14:43

+0

這可能直接用'seaborn'。請參閱:http://web.stanford.edu/~mwaskom/software/seaborn/examples/distplot_options.html – 2014-09-10 02:24:45

回答

1

您必須先計算密度點,然後繪圖。閱讀http://scikit-learn.org/stable/modules/density.html。有些代碼:

from sklearn.neighbors.kde import KernelDensity 
import numpy as np 
import matplotlib.pyplot as plt 

# This X is your data for the histogram 
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]) 
X = X.reshape(-1, 1) 

kde = KernelDensity(kernel='gaussian', bandwidth=1).fit(X) 
x = np.linspace(X.min(), X.max(), 100).reshape(-1, 1) 

density = np.exp(kde.score_samples(x)) 

plt.plot(x, density) 
plt.show() 

enter image description here

+0

謝謝。我很困惑。爲什麼你的Y軸是負面的?不應該積分加起來1? – 2014-09-05 12:07:05

+1

是的,我正在研究它:你必須證明每一個點。編輯!感謝http://nbviewer.ipython.org/github/cs109/content/blob/master/lec_03_statistical_graphs.ipynb – xbello 2014-09-05 12:09:44

+0

謝謝!我想現在仍然缺少的是如何調整這個頻率來代表頻率(如OP所述)。我想知道一個簡單的「1 /密度」是否可以做到這一點? – 2014-09-05 12:33:06