如何使用概率密度函数创建相等的 bin 宽度和相等的 bin 高度直方图
How to create equal bin width and equal bin height histograms using probability density function
通过生成一些随机数据使用直方图估计概率密度函数。我现在想要两个版本的直方图,即等分箱宽度和等分箱高度直方图。
# -*- 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()
如果您想生成具有相等 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 的结果) .
从给定的样本数组 r
,您可以创建一个 "even height histogram",如下所示:
- 对值进行排序。
- 将排序后的数组分成相等的部分,例如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')
通过生成一些随机数据使用直方图估计概率密度函数。我现在想要两个版本的直方图,即等分箱宽度和等分箱高度直方图。
# -*- 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()
如果您想生成具有相等 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 的结果) .
从给定的样本数组 r
,您可以创建一个 "even height histogram",如下所示:
- 对值进行排序。
- 将排序后的数组分成相等的部分,例如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')