3

matplotlibのhist()関数について質問があります。

値が0から1まで変化するデータのヒストグラムをプロットするコードを書いています。例:

values = [0.21, 0.51, 0.41, 0.21, 0.81, 0.99]

bins = np.arange(0, 1.1, 0.1)
a, b, c = plt.hist(values, bins=bins, normed=0)
plt.show()

上記のコードは正しいヒストグラムを生成します(十分な評判がないため、画像を投稿できませんでした)。周波数に関しては、次のようになります。

[0 0 2 0 1 1 0 0 1 1]

この出力を離散確率質量関数に変換したいと思います。つまり、上記の例では、次の周波数値を取得したいと思います。

[ 0.  0.  0.333333333  0.  0.166666667  0.166666667  0.  0.  0.166666667  0.166666667 ] # each item in the previous array divided by 6)

hist()関数のパラメーターを「normed=1」に変更するだけでよいと思いました。ただし、次のヒストグラム頻度が得られます。

[ 0.  0.  3.33333333  0.  1.66666667  1.66666667  0.  0.  1.66666667  1.66666667 ]

これは私が期待していることではなく、合計が1.0である離散確率質量関数を取得する方法がわかりません。次のリンク(質問へのリンク)でも同様の質問がありましたが、問題は解決しなかったと思います。

よろしくお願いします。

4

2 に答える 2

7

その理由は、確率密度関数norm=Trueを与えるためです。確率論では、確率密度関数または連続確率変数の密度は、この確率変数が特定の値をとる相対的な可能性を表します。

非常に簡単な例を考えてみましょう。

x=np.arange(0.1,1.1,0.1)
array([ 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])

# Bin size
bins = np.arange(0.05, 1.15, 0.1)
np.histogram(x,bins=bins,normed=1)[0]
[ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.]
np.histogram(x,bins=bins,normed=0)[0]/float(len(x))
[ 0.1,  0.1,  0.1,  0.1,  0.1,  0.1,  0.1,  0.1,  0.1,  0.1]

# Change the bin size
bins = np.arange(0.05, 1.15, 0.2)
np.histogram(x,bins=bins,normed=1)[0]
[ 1.,  1.,  1.,  1.,  1.]
np.histogram(x,bins=bins,normed=0)[0]/float(len(x))
[ 0.2,  0.2,  0.2,  0.2,  0.2]

上記のように、xが[0.05-0.15]またはの間に[0.15-0.25]ある確率1/10ですが、ビンのサイズをに変更すると、xがまたはの間にある0.2確率がになります。現在、これらの実際の確率値はビンのサイズに依存していますが、確率密度はビンのサイズに依存していません。したがって、これが上記を行う唯一の適切な方法です。そうでない場合は、各プロットでビン幅を指定する必要があります。[0.05-0.25][0.25-0.45]1/5

したがって、あなたの場合、(確率密度ではなく)各ビンで確率値を本当にプロットしたい場合は、各ヒストグラムの頻度を要素の総数で割ることができます。ただし、離散変数を使用していて、各ビンがこの変数の単一の可能な値を表していない限り、これを行わないことをお勧めします。

于 2012-08-01T08:15:43.087 に答える