我试图将核心密度拟合到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()
产生以下结果
第二个版本,使用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()
屈服:
在检查pdf2的值之后,我可以看到这是一个值数组,它们相对于数组中的以下位置的差异是10e-8的数量级,所以几乎是一个常量值数组。
为什么KernelDensity没有返回适当的密度?
答案 0 :(得分:0)
这是因为sklearn
中的某些规范化步骤不得包含在scipy
实施中。您可以自己调整输出,但最快的修复只是更改图:
ax.hist(temp_data, fc='gray', histtype='stepfilled', alpha=0.3, normed=True)
给我一个正确的情节!