Оценка плотности ядра для бимодального распределения с Python - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть бимодальное распределение для диапазона [-0,1, 0,1], которое можно посмотреть здесь:

enter image description here

Я хочу тренироваться / соответствовать Оценка плотности ядра (KDE) для бимодального распределения, как показано на рисунке, и затем, при любом другом распределении, скажем равномерное распределение, такое как:

# a uniform distribution between the same range [-0.1, 0.1]-
u_data = np.random.uniform(low = -0.1, high = 0.1, size = (1782,)) 

Я хочу иметь возможность использовать обученный KDE для 'предсказывать', сколько точек данных из данного распределения данных (скажем, 'u_data') принадлежат целевому бимодальному распределению.

Я пробовал следующий код, но он не работает:

# Here 'a' is the numpy array containing target bimodal distribution.

# Generate random samples-
kde_samples = {}

for kernel in ['tophat', 'gaussian']:
    # Train a kernel on bimodal data distribution 'a'-
    kde = KernelDensity(kernel=kernel, bandwidth=0.2).fit(a.reshape(-1, 1))

    # Try and generate 300 random samples from trained model-
    kde_samples[kernel] = np.exp(kde.sample(300))



# Visualize data distribution using histograms-
plt.hist(a, bins=20, label = 'original distribution')
# sns.distplot(a, kde = True, bins = 20, label = 'original distribution')
plt.hist(kde_samples['gaussian'], bins = 20, label = 'KDE: Gaussian')
plt.hist(kde_samples['tophat'], bins = 20, label = 'KDE: tophat')

plt.title("KDE: Data distribution")
plt.xlabel("weights")
plt.ylabel("frequency")
plt.legend(loc = 'best')
plt.show()

Это дает следующую визуализацию:

KDE different kernels

Две вещи неверны:

  1. Диапазон сгенерированные образцы неверны!
  2. Распределение сгенерированных данных НЕ является бимодальным

Как я могу: обучить / подогнать оценку плотности ядра (KDE) по бимодальному распределению, а затем , учитывая любое другое распределение (скажем, равномерное или нормальное рас можно использовать обученный KDE, чтобы «предсказать», сколько точек данных из данного распределения данных принадлежат целевому бимодальному распределению.

Я использую Python 3.8 и sklearn 0.22.

Спасибо!

...