Matlab's evrnd
генерирует случайные отклонения от распределения Гамбеля, также известного как распределение экстремальных значений Типа I. Как объясняется в этой ссылке,
Используемая здесь версия подходит для моделирования минимумов; зеркальное отображение этого распределения может использоваться для моделирования максимумов путем отрицания R.
Вы можете использовать NumPy реализацию дистрибутива Gumbel , но она использует версию распределения, которое моделирует максимумы, поэтому вам нужно будет перевернуть значения вокруг параметра location (т.е. mu).
Вот скрипт, содержащий функцию Python evrnd
. График, который он генерирует, приведен ниже.
import numpy as np
def evrnd(mu, sigma, size=None, rng=None):
"""
Generate random variates from the Gumbel distribution.
This function draws from the same distribution as the Matlab function
evrnd(mu, sigma, n)
`size` may be a tuple, e.g.
>>> evrnd(mu=3.5, sigma=0.2, size=(2, 5))
array([[3.1851337 , 3.68844487, 3.0418185 , 3.49705362, 3.57224276],
[3.32677795, 3.45116032, 3.22391284, 3.25287589, 3.32041355]])
"""
if rng is None:
rng = np.random.default_rng()
x = mu - rng.gumbel(loc=0, scale=sigma, size=size)
return x
if __name__ == '__main__':
import matplotlib.pyplot as plt
mu = 10
sigma = 2.5
n = 20000
x = evrnd(mu, sigma, n)
# Plot the normalized histogram of the sample.
plt.hist(x, bins=100, density=True, alpha=0.7)
plt.grid(alpha=0.25)
plt.show()
Если вы уже используете SciPy, альтернативой является использование rvs
метод scipy.stats.gumbel_l
. В дистрибутиве SciPy scipy.stats.gumbel_l
реализовано распределение Гумбеля для минимумов, поэтому нет необходимости переворачивать результаты, возвращаемые методом rvs
. Например,
from scipy.stats import gumbel_l
mu = 10
sigma = 2.5
n = 20000
x = gumbel_l.rvs(loc=mu, scale=sigma, size=n)