эквивалентно evrnd (мю, сигма, м, н) в Python - PullRequest
0 голосов
/ 04 февраля 2020

Я хочу альтернативу этой функции Matlab в Python

evrnd(mu,sigma,m,n)

Я думаю Мы можем использовать что-то вроде этого

numpy.random.gumbel

или просто

numpy.random.uniform

Заранее спасибо.

1 Ответ

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

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()

plot


Если вы уже используете 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)

...