scikit KernelDensity返回平坦密度

时间:2018-06-08 14:33:14

标签: python python-3.x scikit-learn kernel-density

我试图将核心密度拟合到S& P返回的时间序列中。然而,产生的密度大多是恒定的。我首先使用stats.gaussian_kde并与scikit的内核密度进行比较。

代码如下:

temp_data = mc_data.iloc[idx_r]['SPX Returns'].dropna().values
X_plot = np.linspace(temp_data.min(),temp_data.max(),100)

kernel = stats.gaussian_kde(temp_data, bw_method='scott')
pdf = kernel.evaluate(X_plot)
fig, ax = plt.subplots()
ax.plot(X_plot, pdf, linewidth=3, alpha=0.5)
ax.hist(temp_data, fc='gray', histtype='stepfilled', alpha=0.3, density=False)
plt.show()     

产生以下结果

enter image description here

第二个版本,使用scikit是:

k_data = temp_data.reshape(-1,1)
kde = KernelDensity(kernel='gaussian', bandwidth=1).fit(k_data)
x_plot = X_plot.reshape(-1,1)
pre_pdf2 = kde.score_samples(x_plot)
pdf2 = np.exp(pre_pdf2)
fig, ax = plt.subplots()
ax.plot(X_plot, pdf2 , linewidth=3, alpha=0.5)
ax.hist(temp_data, fc='gray', histtype='stepfilled', alpha=0.3, density=False)
plt.show()     

屈服:

enter image description here

在检查pdf2的值之后,我可以看到这是一个值数组,它们相对于数组中的以下位置的差异是10e-8的数量级,所以几乎是一个常量值数组。

为什么KernelDensity没有返回适当的密度?

1 个答案:

答案 0 :(得分:0)

这是因为sklearn中的某些规范化步骤不得包含在scipy实施中。您可以自己调整输出,但最快的修复只是更改图:

ax.hist(temp_data, fc='gray', histtype='stepfilled', alpha=0.3, normed=True)

给我一​​个正确的情节!