【问题标题】:sklearn: KDE not working for small valuessklearn:KDE 不适用于小值
【发布时间】:2017-12-15 18:24:22
【问题描述】:

我正在努力为小输入范围实现 KDE 的 scikit-learn 实现。以下代码有效。将除数变量增加到 100 并且 KDE 很困难:

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
from sklearn.neighbors import KernelDensity

# make data:
np.random.seed(0)
divisor = 1
gaussian1 = (3 * np.random.randn(1700))/divisor
gaussian2 = (9 + 1.5 * np.random.randn(300)) / divisor
gaussian_mixture = np.hstack([gaussian1, gaussian2])

# illustrate proper KDE with seaborn:
sns.distplot(gaussian_mixture);

# now implement in sklearn:

x_grid = np.linspace(min(gaussian1), max(gaussian2), 200)

kde_skl = KernelDensity(bandwidth=0.5)
kde_skl.fit(gaussian_mixture[:, np.newaxis])
# score_samples() returns the log-likelihood of the samples
log_pdf = kde_skl.score_samples(x_grid[:, np.newaxis])
pdf = np.exp(log_pdf)

fig, ax = plt.subplots(1, 1, sharey=True, figsize=(7, 4))
ax.plot(x_grid, pdf, linewidth=3, alpha=0.5)

工作正常。但是,将“除数”变量更改为 100,scipy 和 seaborn 可以处理较小的数据值。我的实现无法使用 Sklearn 的 KDE:

我做错了什么,我该如何纠正?我需要 KDE 的 sklearns 实现,所以不能使用其他算法。

【问题讨论】:

    标签: python scikit-learn gaussian kde


    【解决方案1】:

    核密度估计被称为非参数方法,但实际上它有一个称为带宽的参数。

    KDE 的每一个应用都需要这个参数集!

    当你做 seaborn-plot 时:

    sns.distplot(gaussian_mixture);
    

    您没有提供任何带宽,并且 seaborn 使用默认启发式算法(scott 或 silverman)。这些是使用数据以依赖的方式选择一些带宽。

    你的sklearn-code看起来像:

    kde_skl = KernelDensity(bandwidth=0.5)
    

    有一个固定/恒定的带宽!这可能会给您带来麻烦,也可能是这里的原因。但这至少是值得一看的。一般来说,将 sklearn 的 KDE 与 GridSearchCV 结合起来作为交叉验证工具来选择一个好的带宽。在许多情况下,这速度较慢,但​​比上述启发式方法要好。

    遗憾的是,您没有解释为什么要使用 sklearn 的 KDE。我对 3 位热门候选人的个人评分是statsmodels > sklearn > scipy

    【讨论】:

    • 嗨@sascha。我刚刚使用类似于seaborne的方法通过自己的KDE实现。它使用 Silverman 带宽参考规则,似乎可以适当地估计带宽:x = gaussian_mixturebandwidth = 1.06 * x.std() * x.size ** (-1 / 5.) 但是,我希望能够在 sklearn 中使用交叉验证方法,因此将其用作初始值然后执行围绕该值进行小网格搜索,以找到成本函数中的局部最小值。谢谢。
    猜你喜欢
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 2012-04-10
    • 1970-01-01
    • 2013-07-07
    相关资源
    最近更新 更多