Может потребоваться сначала перейти по ссылке на rv_continuous
, из которой rayleigh
подклассами. И оттуда до ppf
, чтобы узнать, что ppf
- это «Функция точки процента». x0 = ppf(0.01)
сообщает, в каком месте все, что меньше x0
, набрало 1% от общего «веса», и аналогично x1 = ppf(0.99)
- это то место, где накапливается 99% «веса». np.linspace(x0, x1, 100)
делит пространство от x0 до x1 за 100 коротких интервалов. Поскольку непрерывное распределение может быть бесконечным, эти пределы x0 и x1 необходимы только для отображения интересного интервала.
rayleigh.pdf(x)
дает pdf в точке x. Таким образом, указание того, насколько вероятен каждый x.
rayleigh.stats(moments='mvsk')
, где моменты - , составленный из букв ['mvsk'], определяет, какие моменты вычислять: 'm' = означает , 'v' = дисперсия , 's' = (Фишер) перекос , 'k' = (Фишер) эксцесс .
Чтобы построить гистограмму и распределение на одном графике, нам нужно знать параметры Роли, соответствующие вашей выборке (loc
и scale
). Кроме того, и PDF, и гистограмма должны иметь одинаковые x
и одинаковые y
. Для x
мы можем взять пределы бинов гистограммы. Для y
мы можем масштабировать pdf, зная, что общая площадь pdf должна быть равна 1. И бункеры гистограммы пропорциональны количеству записей.
Если вы знаете 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()
![example plot](https://i.stack.imgur.com/Z6BLb.png)