Как получить режим распространения в scipy.stats - PullRequest
4 голосов
/ 09 января 2020

Библиотека scipy.stats имеет функции для нахождения среднего значения и медианы подобранного распределения, но не для режима.

Если у меня есть параметры распределения после подгонки к данным, как я могу найти mode подобранного распределения?

1 Ответ

3 голосов
/ 09 января 2020

Если я не ошибаюсь, вы хотите найти режим подогнанных дистрибутивов вместо режима заданных данных. По сути, мы можем сделать это с помощью следующих 3 шагов:

Шаг 1: сгенерировать набор данных из распределения

from scipy import stats
from scipy.optimize import minimize
# generate a norm data with 0 mean and 1 variance
data = stats.norm.rvs(loc= 0,scale = 1,size = 100)
data[0:5]

Вывод:

массив ([1.76405235 , 0.40015721, 0.97873798, 2.2408932, 1.86755799])

Шаг 2: соответствовать параметрам

# fit the parameters of norm distribution
params = stats.norm.fit(data)
params

Выход:

(0,059808015534485, 1.0078822447165796)

Обратите внимание, что для stats.norm есть 2 параметра, то есть loc и scale. Для разных dist в scipy.stats параметры разные. Я думаю, что удобно хранить параметр в кортеже, а затем распаковать его на следующем шаге.

Шаг 3: получить режим (максимум вашей функции плотности) распределенного распределения

# continuous case
def your_density(x):
    return -stats.norm.pdf(x,*paras)
minimize(your_density,0).x

Вывод:

0.05980794

Обратите внимание, что norm распределение имеет mode равно mean. Это совпадение в этом примере.

Еще одна вещь заключается в том, что scipy обрабатывает непрерывный dist и дискретный dist по-разному (у них разные классы отца), вы можете сделать то же самое с помощью следующего кода на дискретных дисках.

## discrete dist, example for poisson
x = np.arange(0,100) # the range of x should be specificied
x[stats.poisson.pmf(x,mu = 2).argmax()] # find the x value to maximize pmf

Out:

1

Вы можете попробовать свои собственные данные и дистрибутивы!

...