代码之家  ›  专栏  ›  技术社区  ›  Yuca

scikit KernelDensity返回平面密度

  •  0
  • Yuca  · 技术社区  · 6 年前

    我试图将内核密度与S&的时间序列相匹配;P返回。然而,产生的密度基本上是一个常数。我首先使用统计数据。并与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,因此几乎是一个常量值数组。

    为什么内核密度没有返回一个合适的密度?

    1 回复  |  直到 4 年前
        1
  •  0
  •   piman314    6 年前

    这是因为有一些正常化的步骤 sklearn 这不能包括在合同中 scipy 实施您可以自己缩放输出,但最快的修复方法就是更改绘图:

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

    给了我正确的情节!