如何使用概率密度函数创建相等的条带宽度和相等的条带高度直方图

问题描述 投票:0回答:2

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

# -*- 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
2个回答
0
投票

如果要生成相等的条带宽度和相等的条带高度直方图,则不能使用正态分布的随机样本。为了实现期望的目标,您需要从分布中获取确定性样本。您可以例如:

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

ax.hist(norm.ppf(xppf, 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()

哪个情节:

enter image description here


0
投票

从给定的样本数组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')

© www.soinside.com 2019 - 2024. All rights reserved.