Я пытался составить график KDE для данных, которые у меня есть (частота сайтов запуска хромосом), и хотя я точно следую примерам , когда я использую свои данные или сгенерированные данные, которые выглядят как мои собственный, весь график портится и выдает только вертикальные линии вместо нормальной кривой. Я надеялся, что кто-то, более знакомый с scikit, узнает, что KDE поможет мне понять, что я делаю неправильно.
Вот код с сгенерированными данными из примера, где все работает нормально:
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from sklearn.neighbors import KernelDensity
X = np.concatenate((np.random.normal(0, 1, 14), np.random.normal(5, 1, 6)))[:, np.newaxis]
X_plot = np.linspace(-5, 10, 1000)[:, np.newaxis]
kde = KernelDensity(kernel='gaussian', bandwidth=1.0).fit(X)
log_density = kde.score_samples(X_plot)
fig, ax = plt.subplots()
plt.fill_between(X_plot[:, 0], np.exp(log_density), color="b")
plt.plot(X, np.full_like(X, -0.01), '|k', markeredgewidth=.01)
ax.set_xlim(-5, 10)
Вот код с данными, которые я сгенерировал, чтобы выглядеть как мои данные. У меня есть 1000 начальных сайтов в данных, и их значение варьируется от 10000 до 824989. Я изменил данные, диапазон и шаг linspace и ось x, и теперь я получаю вертикальные линии вместо кривой. Я также изменил пределы y, потому что они оказались действительно странными.
X = np.random.normal(10000, 824989, 1000)[:, np.newaxis]
X_plot = np.linspace(10000, 824989, 100000)[:, np.newaxis]
kde = KernelDensity(kernel='gaussian', bandwidth=1.0).fit(X)
log_density = kde.score_samples(X_plot)
fig, ax = plt.subplots()
plt.fill_between(X_plot[:, 0], np.exp(log_density), color="b")
plt.plot(X, np.full_like(X, -0.01), '|k', markeredgewidth=.01)
ax.set_xlim(10000, 824989)
ax.set_ylim(-0.0001, 0.00061)
Я думаю, что это как-то связано с linspace. Я не очень понимаю, почему score_samples()
также принимает в качестве параметра linspace.