【问题标题】:Numpy Histogram Representing Floats with Approximate Values as The SameNumpy 直方图表示具有相同近似值的浮点数
【发布时间】:2013-07-19 18:54:59
【问题描述】:

我的代码在给定范围 [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()  

问题在于直方图会生成准确的图,但某些值会破坏趋势。例如,-5.88 对应于频率计数中的大约 30 个条目,大约为 70。我认为 python 会看到这两个值并将它们简单地放在一起,但我不确定如何修复它。但如果只是直方图做错了,那没关系,我真的不需要它。我只需要列表,如果它首先是正确的。

【问题讨论】:

    标签: python numpy histogram probability


    【解决方案1】:

    我认为根本问题是您的 bin 大小是统一的,而 pos 中唯一值之间的差异呈指数增长。正因为如此,你总是会得到奇怪的“尖峰”,其中两个附近的唯一值落在同一个 bin 中,或者很多空的 bin (特别是如果你只是增加 bin 计数以摆脱“尖峰”)。

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

    【讨论】:

      【解决方案2】:

      我相信你很好。我使用bins = 200 而不是bins = 100 重新运行了您的代码,并且尖峰消失了。我认为你的价值观被困在了垃圾箱之间。

      【讨论】:

      • 啊,是的,我明白了。所以现在我想将它标准化为 100,000 次,我应该更多地增加垃圾箱吗?
      • 正确 - 您拥有的数据点越多,您需要越多的 bin 来消除重叠。 ali_m 在下面的回答很聪明,但它提出了一个问题,即为什么你首先要制作这个情节,例如绘制 pos 本身可能比直方图更好
      猜你喜欢
      • 1970-01-01
      • 2014-01-21
      • 2015-09-14
      • 2013-09-17
      • 1970-01-01
      • 2022-11-17
      • 2017-08-20
      • 2013-08-18
      • 2019-07-08
      相关资源
      最近更新 更多