Как получить доступ к параметрам KDE Склеарна для теста Колмогорова-Смирнова Сципи? - PullRequest
0 голосов
/ 22 октября 2018

У меня есть 1-D набор дискретных данных.На этом наборе я хочу выполнить оценку плотности ядра с помощью встроенной функции sklearn:

from sklearn.neighbors.kde import KernelDensity

data = ... # array of shape [5000, 1]

## perform kde with gaussian kernels
kde = KernelDensity(kernel='gaussian', bandwidth=0.8).fit(data.reshape(-1, 1))

С помощью метода экземпляра kde score_samples я могу построить разумную оценку базовой плотностифункция:

pdf created with kde

## code for plot
X_plot = np.linspace(-5, 100, 10000)[:, np.newaxis]
log_dens = kde.score_samples(X_plot)

plt.plot(X_plot[:, 0], np.exp(log_dens))

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

scipy.stats.kstest (rvs, cdf, args = (), N = 20, альтернатива = 'двухсторонний', режим = 'приблизительно')

rvs: str, array или callable

Если строка, это должно быть имя дистрибутива в scipy.stats.Если это массив, то это должен быть одномерный массив наблюдений случайных величин.Если он вызывается, это должна быть функция для генерации случайных переменных;требуется ключевое слово аргумента size.

cdf: str или callable

Если строка, это должно быть имя дистрибутива в scipy.stats.Если rvs является строкой, то cdf может быть False или таким же, как rvs.Если вызывается, то этот вызываемый используется для вычисления cdf.

По сути, rvs - это новый пример данных, а cdf - накопительная функция распределения (интеграл от pdf).Я не смог выяснить, как получить доступ к функции, которая вычисляет pdf в sklearn, чтобы я мог интегрировать ее и передать в kstest.

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

1 Ответ

0 голосов
/ 22 октября 2018

Вы можете просто интегрировать score_samples для получения cdf.scipy.integrate.quad может работать.

** РЕДАКТИРОВАТЬ ** Кажется, что score_samples - это плотность записи, но когда незарегистрированная интегрируется в 1. Требуется ли какое-то изменение формы, играницы интеграции scipy, к сожалению, не принимают массивы.

def cdf(y):
    return functools.partial(
        scipy.integrate.quad,
        lambda x: np.exp(kde.score_samples(np.array([x]).reshape(-1,1)))[0],
        -np.inf
    )(y)[0]

def array_cdf(X):
    return np.array(list(map(cdf, X)))

scipy.stats.kstest(data, array_cdf)
...