Повторная выборка KDE (оценка плотности ядра) в statsmodels - PullRequest
0 голосов
/ 25 мая 2018

Мне интересно использовать образец точек для построения KDE, а затем использовать этот KDE для повторной выборки точек.scipy.stats.gaussian_kde предлагает очень простой способ сделать это.Например, выборка из гауссовского распределения:

import numpy as np
from scipy.stats import gaussian_kde, norm

sampled = np.random.normal(loc = 0, scale = 1, size = 1000)
kde = gaussian_kde(sampled, bw_method = 'silverman')
resampled = kde.resample(1000)

Один недостаток с scipy.stats.gaussian_kde заключается в том, что он предлагает ограниченный выбор для выбора полосы пропускания.Прочитав это , я указал на statsmodels.nonparametric.kernel_density.KDEMultivariate (больше информации здесь ).Это позволяет мне использовать перекрестную проверку для оценки оптимальной полосы пропускания, которая более сложна, если базовый pdf, который вы пытаетесь аппроксимировать, не является унимодальным.Например, используя сумму двух гауссиан, я могу построить KDE, используя KDEMultivariate следующим образом:

from statsmodels.nonparametric.kernel_density import KDEMultivariate
sampled = np.concatenate((np.random.normal(loc = -3, scale = 1, size = 1000), \
                          np.random.normal(loc = 3, scale = 1, size = 1000)))
kde = KDEMultivariate(sampled, 'c', bw = 'cv_ml')

Изучение данных более высокого измерения с произвольным базовым PDF, ясно, что KDEMultivariate можетсоздать PDF, который является гораздо более представительным для оригинального PDF.Но есть большая проблема, с которой я сталкиваюсь - у KDEMultivariate нет метода kde.resample(), и поэтому я не могу пересчитать точки из моего нового KDE.Существует ли простой и эффективный способ повторной выборки из KDE, созданного с использованием statsmodels.nonparametric.kernel_density.KDEMultivariate?

1 Ответ

0 голосов
/ 01 июня 2018

Используя мотивацию из gaussian_kde в scipy, я написал простую процедуру повторной выборки.В statsmodels полоса пропускания соответствует SD гауссовых ядер в каждом измерении.В scipy полоса пропускания ^ 2 умножается на ковариацию данных для построения ковариационной матрицы.

def resample(kde, size):
    n, d = kde.data.shape
    indices = np.random.randint(0, n, size)
    cov = np.diag(kde.bw)**2
    means = kde.data[indices, :]
    norm = np.random.multivariate_normal(np.zeros(d), cov, size)
    return np.transpose(means + norm)

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

...