2013-10-21 64 views
6

如何創建一個直方圖,該直方圖顯示給定的數組x從0到1範圍內的概率分佈?我期望每個欄是< = 1,如果我總結每個欄的y值,他們應該加起來爲1.如何繪製python中的概率質量函數

例如,如果x = [.2,.2,.8],那麼我會期望一個圖表顯示2條,一條在.2處,高度爲0.66,一條在0.8處,高度爲0.33。

我已經試過:

matplotlib.pyplot.hist(x, bins=50, normed=True) 

這給了我與上面去1.我不是說這是錯誤的,因爲這正是賦範參數將根據文檔做吧直方圖,但沒有按不顯示概率。

我也試過:

counts, bins = numpy.histogram(x, bins=50, density=True) 
bins = bins[:-1] + (bins[1] - bins[0])/2 
matplotlib.pyplot.bar(bins, counts, 1.0/50) 

這也給了我條,其Y值之和大於1

回答

3

我認爲我的原始術語是關閉的。我有一組連續值[0-1),我想要離散化並用它來繪製概率質量函數。我認爲這可能是普遍的,足以保證一個單一的方法來做到這一點。

下面的代碼:

x = [random.random() for r in xrange(1000)] 
num_bins = 50 
counts, bins = np.histogram(x, bins=num_bins) 
bins = bins[:-1] + (bins[1] - bins[0])/2 
probs = counts/float(counts.sum()) 
print probs.sum() # 1.0 
plt.bar(bins, probs, 1.0/num_bins) 
plt.show() 
+1

你能解釋爲什麼這部分是必要的嗎? bins = bins [: - 1] +(bins [1] - bins [0])/ 2 – user3314418

3

我認爲你是一個誤總和整體。一個適當的PRF(概率分佈函數)整合到統一中;如果你只是簡單地拿出你可能錯過矩形大小的總和。

import numpy as np 
import pylab as plt 

N = 10**5 
X = np.random.normal(size=N) 

counts, bins = np.histogram(X,bins=50, density=True) 
bins = bins[:-1] + (bins[1] - bins[0])/2 

print np.trapz(counts, bins) 

給出.999985,它足夠接近統一。

編輯:響應於下面的評論:

如果x =和我正在尋找與兩個杆,一個在0.2的曲線圖[2,0.2,0.8。]高度爲.66,因爲66%的數值在.2和一個在0.8的高度爲0.33的柱狀圖,那麼該圖將被調用,我該如何生成它?

以下代碼:

from collections import Counter 
x = [.2,.2,.8] 
C = Counter(x) 
total = float(sum(C.values())) 
for key in C: C[key] /= total 

給出了一個 「字典」 C=Counter({0.2: 0.666666, 0.8: 0.333333})。從這裏可以構建一個條形圖,但是這隻有在PDF爲離散時纔有效,並且只採用一組有限的固定值,這些值彼此分開。

+0

也許我的術語是關閉的。如果x = [。2,.2,.8],我正在尋找一個帶有兩個小節的圖形,一個是.2,高度爲0.66,因爲66%的值是.2,一個是0.8。高度.33,該圖表會被調用什麼,以及如何生成該圖表? – kmosley

+0

什麼是您的數據來源?它是來自連續信號還是離散事件? – Hooked

+0

這是一個連續的信號,我想離散化,這樣我就可以查看條形圖並說出「0.2左右的值大概發生x%的時間」。 – kmosley