Подгонка теоретического распределения к выбранному эмпирическому CDF со статистикой scipy - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть график распределения потерь пакетов CDF.Таким образом, у меня нет исходных данных или самой модели CDF, но есть образцы из кривой CDF.(Данные взяты из графиков, опубликованных в литературе.)

Я хочу найти, какое распределение и с какими параметрами наиболее близко соответствует образцам CDF.

Я видел, что распределения статистики Scipy предлагают метод подгонки (данных), но все примеры применимы к точкам необработанных данных.PDF / CDF впоследствии составляется из установленных параметров.Использование соответствия с моими образцами CDF не дает ощутимых результатов.

Прав ли я, предполагая, что функция fit () не может быть напрямую применена к выборкам данных из эмпирического CDF?

Какие альтернативы я могу использовать, чтобы найти подходящий известный дистрибутив?

Ответы [ 2 ]

0 голосов
/ 19 января 2019

@ tch Спасибо за ответ.Я прочитал технику и успешно применил ее.Я хотел применить соответствие ко всему непрерывному распределению, поддерживаемому scipy.stats, поэтому в итоге я сделал следующее:

fitted = []
failed = []

for d in dist_list:

    dist_name = d[0] #fetch the distribution name
    dist_object = getattr(ss, dist_name) #fetch the distribution object
    param_default = d[1] #fetch the default distribution parameters

    # For distributions with only location and scale set those to the default loc=0 and scale=1
    if not param_default:
        param_default = (0,1)

    # Computed parameters of fitted distribution
    try:
        param,cov = curve_fit(dist_object.cdf,data_in,data_out,p0=param_default,method='trf')

        # Only take distributions which do not result in zero covariance as those are not a valid fit
        if np.any(cov):
            fitted.append((dist_name,param),)

    # Capture which distributions are not possible to be fitted (variety of reasons)       
    except (NotImplementedError,RuntimeError) as e:
        failed.append((dist_name,e),)
        pass

В приведенном выше примере эмпирическое распределение cdf записано в data_out, в котором хранится выборкаcdf значения для диапазона data_in точек данных.Список dist_list содержит для каждого распределения в scipy.stats.rv_continuous имя распределения в качестве первого элемента и список параметров по умолчанию в качестве второго элемента.Параметры по умолчанию я извлекаю из scipy.stats._distr_params.

Некоторые дистрибутивы не могут быть установлены и выдают ошибку.Я держу это список failed.

Наконец, я генерирую список fitted, который содержит для каждого успешно подобранного распределения оценочные параметры.

0 голосов
/ 28 декабря 2018

Я не совсем уверен, что вы пытаетесь сделать.Когда вы говорите, что у вас есть CDF, что это значит?У вас есть какие-то точки данных или сама функция?Было бы полезно, если бы вы могли опубликовать дополнительную информацию или некоторые примеры данных.

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

Мы можем определить функции в форме, необходимой для scipy.optimize.curve_fit.Т.е. первый аргумент должен быть x, а остальные аргументы - это параметры.

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

n = 100
x = np.linspace(-4,4,n)
f = lambda x,mu,sigma: scipy.stats.norm(mu,sigma).cdf(x)

data = f(x,0.2,1) + 0.05*np.random.randn(n)

Теперь используйте curve_fit для поиска параметров.

mu,sigma = scipy.optimize.curve_fit(f,x,data)[0]

Это дает вывод

>> mu,sigma
0.1828320963531838, 0.9452044983927278

Мы можем построить оригинальный CDF (оранжевый),Шумные данные, и установите CDF (синий) и обратите внимание, что он работает довольно хорошоtrue CDF, noisy data, recovered CDF

Обратите внимание, что curve_fit может принимать некоторые дополнительные параметры, и что вывод дает дополнительную информацию о том, насколько хороша функция подбора.

...