我有一个在V_x和V_y方向上的速度数据数组。我使用以下代码绘制了速度范数的直方图,
plt.hist(V_norm_hist, bins=60, density=True, rwidth=0.95)
现在,我还想在此之上添加瑞利分布曲线,但是我无法使其正常工作。我一直在尝试使用scipy.stats.rayleigh进行不同的组合,但是scipy主页并不是很直观,因此我无法使其正常运行...这些行的确切含义
mean, var, skew, kurt = rayleigh.stats(moments='mvsk')
和
x = np.linspace(rayleigh.ppf(0.01),rayleigh.ppf(0.99), 100)
ax.plot(x, rayleigh.pdf(x),'r-', lw=5, alpha=0.6, label='rayleigh pdf')
做?
您可能需要先点击到的链接rv_continuous
,该链接rayleigh
是的子类。然后从那里ppf
找出ppf
“百分比点函数”。x0 = ppf(0.01)
告诉所有小于该点的所有东西x0
都累积在其总“权重”的1%处,类似地,x1 = ppf(0.99)
也是该点上累积 99%的“权重”的地方。np.linspace(x0, x1, 100)
以100个短间隔将x0到x1的空间划分。由于连续分布可以是无限的,因此需要这些x0和x1限制来仅显示有趣的间隔。
rayleigh.pdf(x)
在x处给出pdf。因此,表明每个x的可能性。
rayleigh.stats(moments='mvsk')
力矩由字母['mvsk']组成,其中定义了要计算的力矩:'m'= 均值,'v'= 方差,'s'= (费舍尔)偏斜,'k'= (费舍尔)峰度。
要在同一图上绘制直方图和分布图,我们需要知道与样本(loc
和scale
)相对应的Raleigh参数。此外,pdf和直方图都需要相同x
和相同y
。对于x
我们,我们可以采用直方图箱的极限。对于y
,我们可以放大pdf,知道pdf的总面积应为1。直方图bin与条目数成正比。
如果你知道的loc
是0
,但不知道scale
,维基百科的文章给出了连接一个公式scale
来样的意思是:
estimated_rayleigh_scale = samples.mean() / np.sqrt(np.pi / 2)
假设一个loc
中0
和scale
的0.08
代码将如下所示:
from matplotlib import pyplot as plt
import numpy as np
from scipy.stats import rayleigh
N = 1000
# V = np.random.uniform(0, 0.1, 2*N).reshape((N,2))
# V_norm = (np.linalg.norm(V, axis=1))
scale = 0.08
V_norm_hist = scale * np.sqrt( -2* np.log (np.random.uniform(0, 1, N)))
fig, ax = plt.subplots(1, 1)
num_bins = 60
_binvalues, bins, _patches = plt.hist(V_norm_hist, bins=num_bins, density=False, rwidth=1, ec='white', label='Histogram')
x = np.linspace(bins[0], bins[-1], 100)
binwidth = (bins[-1] - bins[0]) / num_bins
scale = V_norm_hist.mean() / np.sqrt(np.pi / 2)
plt.plot(x, rayleigh(loc=0, scale=scale).pdf(x)*len(V_norm_hist)*binwidth, lw=5, alpha=0.6, label=f'Rayleigh pdf (s={scale:.3f})')
plt.legend()
plt.show()