scikit KernelDensity, возвращающий плоскую плотность - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь подогнать плотность ядра под временной ряд S & P Returns.Однако результирующая плотность в основном постоянная.Сначала я использую 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 голосов
/ 08 июня 2018

Это потому, что в sklearn есть некоторые шаги нормализации, которые не должны быть включены в реализацию scipy.Вы можете масштабировать свои результаты самостоятельно, но самое быстрое решение - просто изменить сюжет:

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

Дает мне правильно выглядящий сюжет!

...