кривая распределения рэлея на гистограмме - PullRequest
1 голос
/ 04 февраля 2020

У меня есть массив данных о скорости в направлениях V_x и V_y. Я построил гистограмму для нормы скорости, используя код ниже,

plt.hist(V_norm_hist, bins=60, density=True, rwidth=0.95)

, который дает следующий рисунок: Histograph for velocity norm

Теперь я также хочу добавить кривую распределения Рэлея поверх этого, но я не могу заставить ее работать. Я пробовал разные комбинации с использованием 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')

сделать?

1 Ответ

1 голос
/ 04 февраля 2020

Может потребоваться сначала перейти по ссылке на 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...