2013-10-21 11 views
6

数値xの配列が0-1の確率分布を示すヒストグラムを作成するにはどうすればよいですか?私は各バーが< = 1であると期待しています。そして、すべてのバーのyの値を合計すると1になるはずです。Pythonで確率質量関数をプロットする方法

たとえば、x = [.2、.2、.8] 2つの棒グラフを示すグラフがあります.1つは.2で高さ.66、1つは.8で高さ.33です。私がそれがノルムパラメータはマニュアルに従って、何をするかだので、それは間違っているとは言わないよ1の上方に行くバーでヒストグラムを与える

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

を、それdoesnの:

私が試してみました確率を示す。

私も試してみた:また私を与える

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

この部分がなぜ必要なのか説明できますか?ビン=ビン[: - 1] +(ビン[1] - ビン[0])/ 2 – user3314418

3

に私はあなたが不可欠ため合計を間違えていると思うバー。適切なPRF(確率分布関数)は1に統合される。単純に合計を取ると、四角形のサイズに欠けている可能性があります。

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) 

これは、1に近づくほど十分です。

編集:以下のコメントを受けて

の場合、X =と私は2つのバー、0.2で1とグラフを探しています[2、0.2、0.8。]値の66%が0.2で、1つのバーが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つの棒を持つグラフを探しています。値の66%が.2にあり、1つの棒が.8で高さ.33、そのグラフはどのように呼び出され、どのように生成するのですか? – kmosley

+0

あなたのデータの出所は?それは連続的な信号から来るのか、それとも離散的な出来事の集合ですか? – Hooked

+0

これは、離散化したい連続的な信号です。棒グラフを見て、「.2の値はおよそx%の時間で発生します」と言うことができます。 – kmosley

関連する問題