Как реализовать тест Колмогорова-Смирнова, чтобы извлечь лучшие дистрибутивы, подходящие для моих данных? - PullRequest
0 голосов
/ 28 января 2019

Я нашел объяснение о том, как ввести описание ссылки здесь Мне нужно сравнить мой дистрибутив на основе теста Колмогорова-Смирнова между моим образцом и каждым из дистрибутивов для соответствия.Но я не знаю, как интерпретировать результаты и выбрать лучший дистрибутив на основе этого теста?Этот код не реализует тест Колмогорова-Смирнова. Так 1 -Как реализовать тест Колмогорова-Смирнова?2 - Как выбрать лучший дистрибутив?

def best_fit_distribution(data, bins=200, ax=None):
    """Model data by finding best fit distribution to data"""
    # Get histogram of original data
    y, x = np.histogram(data, bins=bins, density=True)
    x = (x + np.roll(x, -1))[:-1] / 2.0

    # Distributions to check
    DISTRIBUTIONS = [st.alpha, st.anglit]

    # Best holders
    best_distribution = st.norm
    best_params = (0.0, 1.0)
    best_sse = np.inf

    runs = []
    # Estimate distribution parameters from data
    for distribution in DISTRIBUTIONS:

        # Try to fit the distribution
        try:
            # Ignore warnings from data that can't be fit
            with warnings.catch_warnings():
                warnings.filterwarnings('ignore')

                # fit dist to data
                params = distribution.fit(data)
                print(params)
                # Separate parts of parameters
                arg = params[:-2]
                print(arg)
                loc = params[-2]
                print(loc)
                scale = params[-1]
                print(scale)

                # Calculate fitted PDF and error with fit in distribution
                pdf = distribution.pdf(x, loc=loc, scale=scale, *arg)
                sse = np.sum(np.power(y - pdf, 2.0))

                # if axis pass in add to plot
                try:
                    if ax:
                        pd.Series(pdf, x).plot(ax=ax)
                    end
                except Exception:
                    pass

                runs.append([distribution.name, sse])
                # identify if this distribution is better
                if best_sse > sse > 0:
                    best_distribution = distribution
                    best_params = params
                    best_sse = sse

        except Exception:
            pass
    print(runs)
    return (best_distribution.name, best_params)

1 Ответ

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

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

Чтобы ответить на ваш первый вопрос, я приведу пример критерия пригодности по Колмогорову-Смирнову для нормального распределения в scipy.stats:

stats.kstest(samples, 'norm', args=(0, 1))

, где

  • образцы - собранные / наблюдаемые экспериментальные данные
  • 'норма' - предварительно определенное название теоретического непрерывного распределения
  • args - параметры теоретического распределения, в примере среднее = 0и std = 1

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

Функция stats.kstest возвращает два значения:

  • D - статистика KS
  • pvalue - p-значение для нулевой гипотезы о том, что выборки были взяты из предоставленного теоретического распределения

Таким образом, чтобы ответить на ваш второй вопрос, вам следует отказаться от теста, если p-значение меньше вашегозначение значимости.В случае, если нулевая гипотеза не может быть отвергнута, вы можете сравнить значения D и выбрать распределение с наименьшим значением D, поскольку оно означает соответствие качества: чем меньше значение D, тем лучше оно соответствует данным.

...