3

[0,1) の範囲を指定して -10 から 10 の特定の値を生成するコードがあります。コードは -10 から 10 の値を取り、その確率に応じてリストに追加します。たとえば、-10 は値 0 に対応するためリストに 0 回入力され、10 は範囲内の 1 に対応するため (正規化として) 100 回入力されます。

コードは次のとおりです。

#!/usr/bin/env python

import math
import numpy as np
import matplotlib.pyplot as plt

pos = []
ceilingValue = 0.82
pValues = np.linspace(0.00, ceilingValue, num=100*ceilingValue)

for i in xrange(int(100*ceilingValue)):
    p = pValues[i]
    y = -11.63*math.log(-2.36279*(p - 1))
    for j in xrange(i):
        pos.append(y)

avg = np.average(pos)    
std = np.std(pos)    

hist, bins = np.histogram(pos,bins = 100)
width = 0.7*(bins[1]-bins[0])
center = (bins[:-1]+bins[1:])/2
plt.bar(center, hist, align = 'center', width = width)
plt.show()  

問題は、ヒストグラムが正確なプロットを生成することですが、特定の値が傾向を崩すことです。たとえば、頻度カウントの約 30 エントリに対応する -5.88 は約 70 になります。Python は 2 つの値を見て、単純にそれらをまとめていると思いますが、修正方法がわかりません。しかし、それが何か間違ったことをしているヒストグラムだけであれば、それは問題ではありません。私はそれを本当に必要としません。そもそもリストが正しければ、リストが必要です。

4

2 に答える 2

3

根本的な問題は、ビンのサイズが均一であるのに対し、一意の値の違いはpos指数関数的にスケーリングされることだと思います。そのため、近くにある 2 つの一意の値が同じビン内に収まる奇妙な「スパイク」、または多数の空のビンが常に発生します (特に、「スパイク」を取り除くためにビンの数を増やすだけの場合)。

の実際の一意の値に従ってビンを設定しposて、幅が不均一になるようにすることができます。

 # the " + [10,]" forces the rightmost bin edge to == 10
 uvals = np.unique(pos+[10,])
 hist, bins = np.histogram(pos,bins=uvals)
 plt.bar(bins[:-1],hist,width=np.diff(bins))

ここに画像の説明を入力

于 2013-07-19T19:29:32.673 に答える