我一直在尝试为我拥有的数据(染色体起始位点的频率)制作一个KDE图,尽管我严格遵循examples,但是当我使用我的数据或生成的数据看起来像我自己的数据时,整个图弄乱并仅产生垂直线,而不是法线。我希望对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)
这里是代码,其中包含我生成的数据,看起来像我的数据。我在数据中有1,000个起始站点,它们的值范围从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作为参数。
您的代码有两个问题:
np.linspace()
的目的是生成一组数据点,在这些数据点处可以评估估计的内核密度函数kde
。为了可视化数据的完整分布,应将np.linspace()
的第一个参数设置为等于数据的最小值(而不是数据的平均值),并且应将np.linspace()
的第二个参数设置为等于数据的最大值(而不是数据的标准偏差)。我在下面提供了一个示例。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KernelDensity
X = np.random.normal(10000, 824989, 1000)[:, np.newaxis]
X_plot = np.linspace(np.min(X), np.max(X), 100000)[:, np.newaxis]
# bandwidth
h = 0.9 * np.min([np.std(X), (np.percentile(X, 75) - np.percentile(X, 25)) / 1.34]) * (len(X) ** (- 1 / 5))
kde = KernelDensity(kernel='gaussian', bandwidth=h).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), '|k', markeredgewidth=.01)