Подгонка данных указывает на кумулятивное распределение

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

import scipy.stats as ss
import numpy as np
dataPoints = np.arange(0,1000,0.2)
fit_alpha,fit_loc,fit_beta = ss.rv_continuous.fit(ss.gamma, dataPoints, floc=0)

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

Для этого я хочу сопоставить кумулятивное распределение, а не pdf, с меньшими данными о распределении.Точнее, я хочу сопоставить данные только с частью кумулятивного распределения.

Например, я хочу подгонять данные только до тех пор, пока кумулятивная функция вероятности (с определенным масштабом и формой) не достигнет 0,6.

Любые мысли об использовании fit() для этой цели?


person Sahil M    schedule 17.09.2013    source источник
comment
Не могли бы вы просто построить эмпирическую cdf из ваших данных и подогнать ее к гамма-cdf, используя, например, curve_fit, docs.scipy.org/doc/scipy/reference/generated/ ?   -  person ev-br    schedule 17.09.2013
comment
Я думаю, что ваш ss.gamma.fit(dataPoints, floc=0) не дает никаких значимых результатов, потому что ваши точки данных не являются образцом из гамма-распределения. fit может оценить параметры распределения только по точкам выборки. Следуйте совету Жени, если вы просто хотите подогнать форму cdf. Или подгоните точки выборки к усеченной версии гамма-распределения.   -  person Josef    schedule 17.09.2013
comment
@Zhenya Да, я думал об этом как о крайнем случае, если функция для этого недоступна по нескольким причинам, одна из которых заключается в том, что я хотел использовать для этого MLE, а не метод наименьших квадратов. А во-вторых, cdf для gamma немного нетривиален (но, конечно, возможен). В-третьих, знаете ли вы, как я могу ограничить посадку, как указано в вопросе?   -  person Sahil M    schedule 17.09.2013
comment
@user333700 user333700 Я использовал это только в качестве примера, на самом деле я не пытаюсь подогнать что-то, что детерминистически не является гаммой для гаммы. И что вы подразумеваете под соответствием форме cdf и усеченной версией гамма-распределения?   -  person Sahil M    schedule 17.09.2013
comment
Если у вас есть точки выборки, которые относятся только к части распределения, вы можете определить новое усеченное распределение pdf_trunc(x) = pdf(x)/cdf(truncation_point) с точкой усечения = ppf(0,6, известные параметры) и оценить их. Если у вас есть несколько частей, вы можете сшить их вместе как раздачу смеси. (При условии, что я правильно понял ваш вопрос.)   -  person Josef    schedule 17.09.2013
comment
@ user333700 Не могли бы вы немного пояснить, почему pdf_trunc (x) = pdf (x) / cdf (truncation_point) математически представляет усеченное распределение? Кроме того, извините, я не знаком с ppf, вы имеете в виду кусочно-полиномиальную интерполяцию?   -  person Sahil M    schedule 18.09.2013
comment
en.wikipedia.org/wiki/Truncated_distribution и ppf — это обратный cdf (квантильная функция) вызывается в scipy.stats.distributions.   -  person Josef    schedule 18.09.2013
comment
@user333700 user333700 Да, усеченные дистрибутивы — хорошая рекомендация, спасибо. Мне нужно некоторое время, чтобы поразмыслить над этим, чтобы понять его в деталях. Я вернусь сюда завтра, так как здесь 2 часа ночи!   -  person Sahil M    schedule 18.09.2013
comment
Довольно интересно, я подозреваю, что установка pdf и cdf не эквивалентна наиболее распространенным функциям ошибок (евклидова, манхэттенская и т. д.). У кого-нибудь есть хорошая ссылка, которая решает эту проблему?   -  person Dima Tisnek    schedule 12.12.2014
comment
Как отметил @qarma, подгонка точек данных к cdf не обходится без проблем, поскольку добавляет дополнительную семантику по сравнению с обычной оценкой. Одна из причин заключается в том, что соответствие оценщику cdf не является инвариантным по отношению к преобразованиям координат (например, F(x) => F(-x) или поворотам в многомерном случае), поскольку имеет значение направление интегрирования (например, x или -x). @ Бенджамин, не могли бы вы дать больше информации о том, какова мотивация смотреть на cdfs вместо pdfs?   -  person Dietrich    schedule 03.03.2015
comment
Кстати, я согласен с @ev-br, что общий curve_fit, вероятно, лучший способ сделать это.   -  person Dima Tisnek    schedule 03.03.2015
comment
Не могли бы вы предоставить нам дополнительную информацию о проблеме. Похоже, вы подгоняете несколько из этих «усеченных» дистрибутивов, а затем каким-то образом их комбинируете. Я думаю, что ответ на ваш вопрос зависит от того, как вы планируете использовать полученный комбинированный дистрибутив.   -  person Dan Frank    schedule 28.03.2015


Ответы (1)


Я понимаю, что вы пытаетесь кусочно реконструировать свой cdf с несколькими небольшими гамма-распределениями, каждое из которых имеет разные параметры масштаба и формы, охватывающие «локальные» области вашего распределения.

Вероятно, имеет смысл, если ваше эмпирическое распределение является мультимодальным / его трудно обобщить одним «глобальным» параметрическим распределением.

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

http://scikit-learn.org/stable/modules/density.html http://en.wikipedia.org/wiki/Kernel_density_estimation

Например, вы можете попробовать гауссово ядро ​​и изменить параметр полосы пропускания, чтобы контролировать, насколько гладкой будет ваша подгонка. Слишком малая полоса пропускания приводит к негладкому («переоснащенному») результату [высокая дисперсия, низкое смещение]. Слишком большая полоса пропускания приводит к очень плавному результату, но с большим смещением.

from sklearn.neighbors.kde import KernelDensity
kde = KernelDensity(kernel='gaussian', bandwidth=0.2).fit(dataPoints) 

Таким образом, хороший способ выбрать параметр пропускной способности, который уравновешивает компромисс между смещением и дисперсией, — это использовать перекрестную проверку. По сути, идея высокого уровня заключается в том, что вы разделяете свои данные, запускаете анализ обучающего набора и «проверяете» тестовый набор, это предотвратит переоснащение данных.

К счастью, sklearn также реализует хороший пример выбора лучшей пропускной способности ядра Guassian с использованием перекрестной проверки, из которой вы можете позаимствовать код:

http://scikit-learn.org/stable/auto_examples/neighbors/plot_digits_kde_sampling.html

Надеюсь это поможет!

person Azmy Rajab    schedule 16.04.2015