Как получить логарифмическую вероятность экспоненциального и гамма-распределений

У меня есть некоторые данные, и я могу подобрать гамма-распределение, используя, например, этот код, взятый из Подгонка гамма-распределения с помощью (python) Scipy.

import scipy.stats as ss
import scipy as sp

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

alpha=5
loc=100.5
beta=22
data=ss.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=ss.gamma.fit(data)
print(fit_alpha,fit_loc,fit_beta)
# (5.0833692504230008, 100.08697963283467, 21.739518937816108)

print(alpha,loc,beta)
# (5, 100.5, 22)

Я также могу подогнать экспоненциальное распределение к тем же данным. Однако я хотел бы провести тест отношения правдоподобия. Для этого мне нужно не просто подогнать дистрибутивы, но и вернуть вероятность. Как вы можете сделать это в Python?


person eleanora    schedule 30.08.2014    source источник


Ответы (1)


Вы можете вычислить логарифмическую вероятность data, вызвав метод logpdf для stats.gamma и затем суммируя массив.

Первый фрагмент кода взят из вашего примера:

In [63]: import scipy.stats as ss

In [64]: np.random.seed(123)

In [65]: alpha = 5

In [66]: loc = 100.5

In [67]: beta = 22

In [68]: data = ss.gamma.rvs(alpha, loc=loc, scale=beta, size=10000)

In [70]: data
Out[70]: 
array([ 159.73200869,  258.23458137,  178.0504184 , ...,  281.91672824,
        164.77152977,  145.83445141])

In [71]: fit_alpha, fit_loc, fit_beta = ss.gamma.fit(data)

In [72]: fit_alpha, fit_loc, fit_beta
Out[72]: (4.9953385276512883, 101.24295938462399, 21.992307537192605)

Вот как вычислить логарифмическую вероятность:

In [73]: loglh = ss.gamma.logpdf(data, fit_alpha, fit_loc, fit_beta).sum()

In [74]: loglh
Out[74]: -52437.410641032831
person Warren Weckesser    schedule 31.08.2014