У меня есть бимодальное распределение для диапазона [-0,1, 0,1], которое можно посмотреть здесь:
![enter image description here](https://i.stack.imgur.com/DMcXH.png)
Я хочу тренироваться / соответствовать Оценка плотности ядра (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](https://i.stack.imgur.com/Sbl4x.png)
Две вещи неверны:
- Диапазон сгенерированные образцы неверны!
- Распределение сгенерированных данных НЕ является бимодальным
Как я могу: обучить / подогнать оценку плотности ядра (KDE) по бимодальному распределению, а затем , учитывая любое другое распределение (скажем, равномерное или нормальное рас можно использовать обученный KDE, чтобы «предсказать», сколько точек данных из данного распределения данных принадлежат целевому бимодальному распределению.
Я использую Python 3.8 и sklearn 0.22.
Спасибо!