【问题标题】:How to create equal bin width and equal bin height histograms using probability density function如何使用概率密度函数创建相等的 bin 宽度和相等的 bin 高度直方图
【发布时间】:2020-10-01 16:33:21
【问题描述】:

通过生成一些随机数据,使用直方图估计概率密度函数。我现在想要两个版本的直方图,即相等的 bin 宽度和相等的 bin 高度直方图。

# -*- coding: utf-8 -*-
from scipy.stats import norm
import matplotlib.pyplot as plt
#import pandas as pd
import numpy as np
fig, ax = plt.subplots(1, 1)

#Calculate a few first moments:
mean, var, skew, kurt = norm.stats(moments='mvsk')

#Display the probability density function (pdf):
x = np.linspace(norm.ppf(0.01),
                norm.ppf(0.99), 100)
ax.plot(x, norm.pdf(x),
       'r-', lw=5, alpha=0.6, label='norm pdf')

#Freeze the distribution and display the frozen pdf:
rv = norm()
ax.plot(x, rv.pdf(x), 'b-', lw=2, label='frozen pdf')

#Check accuracy of cdf and ppf:
vals = norm.ppf([0.001, 0.5, 0.999])
np.allclose([0.001, 0.5, 0.999], norm.cdf(vals))

#Generate random numbers:
r = norm.rvs(size=10000)

#df = pd.read_excel('ardata.xlsx')
#r = df[['dest','source']].values


#And compare the histogram:
ax.hist(r, density=True, histtype='stepfilled', alpha=0.2)
ax.legend(loc='best', frameon=False)
plt.show()

【问题讨论】:

    标签: python-3.x matplotlib histogram probability-density


    【解决方案1】:

    如果您想生成具有相等 bin 宽度和 bin 高度的直方图,您不能使用正态分布的随机样本(请参阅rvs 函数的文档)。为了达到预期的目标,您需要从分布中获取确定性样本。例如,您可以这样做:

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.stats import norm
    
    
    fig, ax = plt.subplots(1, 1)
    
    # Display the probability density function (pdf):
    
    xppf = np.linspace(norm.ppf(0.01),
                       norm.ppf(0.99), 100000)
    
    ax.plot(xppf, norm.pdf(xppf, loc=0),
            'r-', lw=3, alpha=0.6, label='norm pdf')
    
    # Create histogram:
    
    mybins = np.linspace(norm.ppf(0.01), norm.ppf(0.99), num=12)  # Evenly spaced bins
    myvals = np.linspace(0.01, 0.99, 100000)
    
    ax.hist(norm.ppf(myvals, loc=0), bins=mybins, density=True,
            histtype='stepfilled', alpha=0.2)
    
    ax.legend(loc='best', frameon=False)
    plt.xlabel(r'x')
    plt.ylabel(r'PDF(x)')
    plt.show()
    

    哪些地块:

    获得的直方图将具有均匀间隔的 bin(示例中的 12 个 bin 使用 linspace 设置)并且它们也将具有相同的高度,因为采样是确定性的(也是使用 linspace 的结果)。

    【讨论】:

    • 我在 excel 数据表的两列中有示例,例如:源和目标。如何使用上述代码获取 P(x) 值?
    • @HumairAliPalh 很高兴看到答案对您有所帮助。您可以使用 pandas read_excel 函数解析数据表中的数据。像pd.read_excel('datasheet.xlsx', index_col=0) 这样的东西,然后取数据框列中的值。您评论的代码是在正确的轨道上。
    • 因为我已经使用 pandas 解析了我的数据。我只对PDF(x) 的一件事感到困惑,我怎样才能使用 PDF 获得这些值!
    • @HumairAliPalh 对您的数据使用 norm.pdf(xdata) 方法来获取概率密度函数的值。要获取直方图条的高度,请使用百分比点函数(分位数函数)norm.ppf
    【解决方案2】:

    从给定数组r 的样本中,您可以创建一个“等高直方图”,如下所示:

    • 对值进行排序。
    • 将排序后的数组分成相等的部分,例如10 份。
    • 使用与这些索引对应的值作为某些条形的分隔符。
    • 要获得1 的标准化区域,高度乘以宽度应为1。由于宽度只是排序元素的第一个到最后一个的范围,因此高度应该是它的倒数。

    多次运行会产生一些不同的图,因为随机的最小值和最大值会有很大差异。

    s = np.sort(r)
    bins = 10
    ind = np.arange(bins + 1) * (s.size - 1) // bins
    ax.bar(s[ind][:-1], 1/(s[-1] - s[0]), width=np.diff(s[ind]),
           color='g', alpha=0.4, ec='k', align='edge', zorder=-1, label='equal heights hist')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      相关资源
      最近更新 更多