Numpy直方图表示具有近似值的浮点数相同

时间:2013-07-19 18:54:59

标签: python numpy histogram probability

我有从[0,1)范围内生成-10到10的特定值的代码 代码取值为-10到10,并根据其概率将其附加到列表中。例如,-10将被列入列表0次,因为它对应于值0,而10将被放置100次(作为规范化),因为它对应于范围中的1。

以下是代码:

#!/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 个答案:

答案 0 :(得分:3)

我认为潜在的问题是你的bin大小是统一的,而pos中唯一值之间的差异是指数级的。因此,你总是以奇怪的“尖峰”结束,其中两个附近的唯一值落在同一个bin中,或者许多空的bin(特别是如果你只是增加bin计数以消除'spikes')。

您可以尝试根据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))

enter image description here

答案 1 :(得分:2)

我相信你很好。我使用bins = 200代替bins = 100重新编写代码,然后峰值消失了。我认为你的价值已经陷入了垃圾箱之间的界限。