Указание среднего значения и дисперсии в распределительном Python Python 2.7 - PullRequest
0 голосов
/ 29 мая 2018

Мне нужно со временем выбрать случайную выборку из некоторого распределения, поэтому мне нужен такой, который позволяет мне легко изменять среднее значение и дисперсию.Я смотрю на использование дистрибутивов из библиотеки scipy.stats, однако мне сложно увидеть, как параметры "loc" и "scale" связаны с интересующими меня количествами. Я хотел бы иметь возможностьсделать что-то вроде:

x = numpy.linspace(0,5,1000)
y = scipy.stats.maxwell(x, mean, variance)

Но loc и scale, похоже, являются единственными другими аргументами, которые принимает функция.Может ли кто-нибудь указать отношения, которые должны иметь значения и дисперсии этих величин, или предложить лучшую библиотеку для использования?

1 Ответ

0 голосов
/ 29 мая 2018

Ну, у меня нет Python 2.7, так что ответ будет для Python 3.6, но он должен работать, в конце концов, это scipy.

По сути, вы должны извлечь scale и loc параметры из заданных μ и σ.Вот две простые функции для этого, плюс некоторая выборка, чтобы доказать, что мы получаем правильные значения.По сути, первая печатная строка - это то, что вам нужно, а третья строка - результат выборки, она должна быть примерно одинаковой.Вторая строка - scale и loc, вычисленные из μ и σ.Поиграй с числами, посмотри, как идут дела

import numpy as np
from scipy.stats import maxwell

def get_scale_from_sigma(sigma):
    """Compute scale from sigma based upon http://mathworld.wolfram.com/MaxwellDistribution.html"""
    a2 = np.pi*sigma / (3.0*np.pi - 8.0)
    return np.sqrt(a2)

def get_loc_from_mu_sigma(mu, sigma):
    """Compute loc from mu/sigma based upon http://mathworld.wolfram.com/MaxwellDistribution.html"""
    scale = get_scale_from_sigma(sigma)
    loc = mu - 2.0 * scale * np.sqrt(2.0 / np.pi)
    return loc

sigma = 1.0
mu    = 2.0 * get_scale_from_sigma(sigma) * np.sqrt(2.0 / np.pi) # + 3.0 as shift, for exampl
print(mu, sigma)

scale = get_scale_from_sigma(sigma)
loc   = get_loc_from_mu_sigma(mu, sigma)

print(scale, loc)

q = maxwell.rvs(size=10000, scale = scale, loc = loc)
print(np.mean(q), np.std(q))
...