Подгонка гамма-распределения с помощью (python) Scipy

Может ли кто-нибудь помочь мне установить гамма-распределение в Python? Что ж, у меня есть некоторые данные: координаты X и Y, и я хочу найти параметры гаммы, которые подходят для этого распределения ... В Scipy doc, оказалось, что подходящий метод действительно существует, но я не знаю, как его использовать. : s .. Во-первых, в каком формате должен быть аргумент "данные" и как я могу предоставить второй аргумент (параметры), если это то, что я ищу?


person Archanimus    schedule 24.05.2010    source источник


Ответы (5)


Сгенерируйте некоторые гамма-данные:

import scipy.stats as stats    
alpha = 5
loc = 100.5
beta = 22
data = stats.gamma.rvs(alpha, loc=loc, scale=beta, size=10000)    
print(data)
# [ 202.36035683  297.23906376  249.53831795 ...,  271.85204096  180.75026301
#   364.60240242]

Здесь мы подгоняем данные к гамма-распределению:

fit_alpha, fit_loc, fit_beta=stats.gamma.fit(data)
print(fit_alpha, fit_loc, fit_beta)
# (5.0833692504230008, 100.08697963283467, 21.739518937816108)

print(alpha, loc, beta)
# (5, 100.5, 22)
person unutbu    schedule 24.05.2010
comment
Большое спасибо ! Но почему вы изначально создали переменную x? - person Archanimus; 24.05.2010
comment
А, похоже, мое сообщение пришло слишком поздно. Еще раз большое спасибо;) - person Archanimus; 24.05.2010
comment
scipy.stats использует оценку максимального правдоподобия для подгонки, поэтому вам нужно передавать необработанные данные, а не pdf / pmf (x, y) - person Christian Alis; 07.11.2010
comment
Обратите внимание, что бета используется для обозначения параметра «скорость» распределения, который является инверсией «формы». - person vahid; 01.12.2020

Я был недоволен функцией ss.gamma.rvs, поскольку она может генерировать отрицательные числа, чего не должно быть в гамма-распределении. Итак, я подогнал образец через ожидаемое значение = среднее (данные) и дисперсию = var (данные) (подробности см. В Википедии) и написал функцию, которая может выдавать случайные образцы гамма-распределения без scipy (которое мне было трудно правильно установить, на полях):

import random
import numpy

data = [6176, 11046, 670, 6146, 7945, 6864, 767, 7623, 7212, 9040, 3213, 6302, 10044, 10195, 9386, 7230, 4602, 6282, 8619, 7903, 6318, 13294, 6990, 5515, 9157]

# Fit gamma distribution through mean and average
mean_of_distribution = numpy.mean(data)
variance_of_distribution = numpy.var(data)

def gamma_random_sample(mean, variance, size):
    """Yields a list of random numbers following a gamma distribution defined by mean and variance"""
    g_alpha = mean*mean/variance
    g_beta = mean/variance
    for i in range(size):
        yield random.gammavariate(g_alpha,1/g_beta)

# force integer values to get integer sample
grs = [int(i) for i in gamma_random_sample(mean_of_distribution,variance_of_distribution,len(data))]

print("Original data: ", sorted(data))
print("Random sample: ", sorted(grs))

# Original data: [670, 767, 3213, 4602, 5515, 6146, 6176, 6282, 6302, 6318, 6864, 6990, 7212, 7230, 7623, 7903, 7945, 8619, 9040, 9157, 9386, 10044, 10195, 11046, 13294]
# Random sample:  [1646, 2237, 3178, 3227, 3649, 4049, 4171, 5071, 5118, 5139, 5456, 6139, 6468, 6726, 6944, 7050, 7135, 7588, 7597, 7971, 10269, 10563, 12283, 12339, 13066]
person mondano    schedule 04.04.2014

Если вам нужен длинный пример, включающий обсуждение оценки или исправления поддержки дистрибутива, вы можете найти его в https://github.com/scipy/scipy/issues/1359 и сообщение связанного списка рассылки.

В магистральную версию scipy добавлена ​​предварительная поддержка для исправления параметров, таких как местоположение, во время подгонки.

person Josef    schedule 09.11.2010

OpenTURNS предлагает простой способ сделать это с помощью класса GammaFactory.

Сначала сгенерируем образец:

import openturns as ot
gammaDistribution = ot.Gamma()
sample = gammaDistribution.getSample(100)

Затем подгоните к нему гамму:

distribution = ot.GammaFactory().build(sample)

Затем мы можем нарисовать PDF гаммы:

import openturns.viewer as otv
otv.View(distribution.drawPDF())

который производит:

Гамма-распределение

Более подробная информация по этой теме: http://openturns.github.io/openturns/latest/user_manual/_generated/openturns.GammaFactory.html

person Michael Baudin    schedule 02.12.2019

1): переменная «data» может быть в формате списка или кортежа python или массива numpy.ndarray, который можно получить с помощью:

data=numpy.array(data)

где вторые данные в приведенной выше строке должны быть списком или кортежем, содержащим ваши данные.

2: переменная «параметр» - это первое предположение, которое вы можете дополнительно указать функции подгонки в качестве отправной точки для процесса подгонки, поэтому ее можно опустить.

3: примечание к ответу @mondano. Использование моментов (среднего и дисперсии) для определения параметров гаммы достаточно хорошо для больших параметров формы (альфа> 10), но может дать плохие результаты для малых значений альфа (см. Статистические методы в атмосферных исследованиях < / em> Уилкса и THOM, HCS, 1958: Примечание о гамма-распределении, Mon. Wea. Rev., 86, 117–122.

Использование оценщиков максимального правдоподобия, реализованных в модуле scipy, считается лучшим выбором в таких случаях.

person Jason    schedule 23.04.2014