Рассчитать расхождение KL между двумя списками гамма-распределения

У меня есть два списка. Оба включают нормализованные проценты:

  • фактическое_население_распределение = [0,2,0,3,0,3,0,2]
  • sample_population_distribution = [0,1,0,4,0,2,0,3]

Я хочу подогнать эти два списка к гамма-распределению, а затем вычислить возвращенные два списка, чтобы получить значение KL.

Я уже смог получить KL.

Это функция, которую я использовал для расчета гаммы:

def gamma_random_sample(data_list):
    mean = np.mean(data_list)
    var = np.var(data_list)
    g_alpha = mean * mean / var
    g_beta = mean / var
    for i in range(len(data_list)):
        yield random.gammavariate(g_alpha, 1/g_beta)

Подгонка двух списков к гамма-распределению:

actual_grs = [i for i in f.gamma_random_sample(actual_population_distribution)]
sample_grs = [i for i in f.gamma_random_sample(sample_population_distribution)]

Это код, который я использовал для расчета KL:

kl = np.sum(scipy.special.kl_div(actual_grs, sample_grs))

Приведенный выше код не выдает никаких ошибок.

Но я подозреваю, что то, что я сделал для гаммы, неверно, потому что np.mean/var нужно получить среднее значение и дисперсию.

Действительно, число отличается от:

mean, var, skew, kurt = gamma.stats(fit_alpha, loc = fit_loc, scale = fit_beta, moments = 'mvsk')

если я использую этот способ.

Используя «mean, var, skew, kurt = gamma.stats(fit_alpha, loc = fit_loc, scale = fit_beta, moments = 'mvsk')», я получу значение KL намного больше 1, поэтому оба способа недействительны для получения правильного KL.

Что мне не хватает?


person Jennifer    schedule 05.08.2019    source источник


Ответы (1)


См. этот пост о переполнении стека: https://stats.stackexchange.com/questions/280459/estimating-gamma-distribution-parameters-using-sample-mean-and-std

Я не понимаю, что вы пытаетесь сделать с:

actual_grs = [i for i in f.gamma_random_sample(actual_population_distribution)]
sample_grs = [i for i in f.gamma_random_sample(sample_population_distribution)]

Это не похоже на то, что вы подходите к гамма-распределению, похоже, что вы используете метод оценки момента, чтобы получить параметры гамма-распределения, а затем рисуете одно случайное число для каждого элемента вашего фактического (образца). )_population_distribution списки с учетом статистики распределения списка.

Известно, что гамма-распределение трудно подобрать. Я надеюсь, что ваши фактические данные имеют более длинный список - 4 точки данных вряд ли достаточно для оценки распределения двух параметров. Оценки будут своего рода мусором, пока вы не получите сотни элементов или более, взгляните на этот документ по оценке MLE для информации Фишера о гамма-распределении: https://www.math.arizona.edu/~jwatkins/O3_mle.pdf .

Я тоже не знаю, что вы пытаетесь сделать с расхождением kl. Ваше фактическое население уже нормализовано до 1, как и выборочное распределение. Вы можете подключить эти элементы непосредственно к расхождению KL для дискретной оценки — то, что вы делаете с вашим кодом, — это растяжение и добавление гамма-шума к исходным значениям списка с помощью определенной вами гамма-функции. Скорее всего, у вас будет большее отклонение с расхождением KL после гамма-искажения ваших исходных данных о населении.

Извините, я просто не понимаю, чего вы пытаетесь достичь здесь. Если бы мне пришлось угадывать ваши первоначальные намерения, я бы сказал, что ваша проблема в том, что вам нужны сотни точек данных, чтобы гарантировать сходимость с любой программой подбора гаммы.

РЕДАКТИРОВАТЬ: я просто хотел добавить это в отношении расхождения KL. Если вы намереваетесь оценить подходящие гамма-распределения с помощью расхождения KL, лучше использовать аналитическое решение, в котором параметры масштаба и формы ваших двух гамма-распределений являются вашими двумя входными данными. Случайная выборка зашумленных точек данных будет бесполезна, если вы не возьмете 100 000 случайных выборок и не разложите их по 1000 бинам или около того, а затем нормализуете свою гистограмму — я просто выбрасываю эти числа, но вы захотите аппроксимировать непрерывную распределения как можно лучше, и это будет сложно, потому что гамма-распределения имеют длинные хвосты. Этот документ содержит аналитическое решение для обобщенного распределения: https://arxiv.org/pdf/1401.6853.pdf . Просто установите этот третий параметр равным 1 и упростите, а затем напишите код функции.

person Pedro Relich    schedule 08.08.2019