【问题标题】:gaussian_kde with skewed distributions?gaussian_kde 偏斜分布?
【发布时间】:2014-02-20 12:00:21
【问题描述】:

我需要对从对数正态分布生成的数据进行核密度估计。我一直在使用 gaussian_kde 并在 Python 中使用 matplotlib 绘制数据。

但是,一个问题是数据具有如此极端的偏差,以至于很难正确地绘制分布密度图。在我的示例中,大多数分布都非常接近 0,但由于极端偏斜,密度估计最终在 x 轴上的分布比应有的更远。如果我增加 bin 大小,我可以获得更好的分辨率,但这需要很长时间。

有人知道这个问题的解决方案吗?这是否需要选择不同的带宽?

这是我生成数据的一些示例代码:

k = np.random.normal(loc = -15, scale = 6, size = 10e3)
k = exp(k)
xs = np.linspace(min(k), max(k), 2500)
density = gaussian_kde(k)
d = density(xs)
plot(xs, d)
xlim(0, 5)

密度分布相当均匀,但当取 k 的中值时,它几乎为零。

有人对此有任何解决方案吗?谢谢!

【问题讨论】:

    标签: python matplotlib kernel scipy


    【解决方案1】:

    是的,gaussian_kde 的自动带宽选择在这种情况下不起作用。

    gaussian_kde 的带宽选择基于方差的估计。在这种情况下,方差非常大,因为有一些非常大的观测值。更好的选择是基于 MAD(中值绝对偏差)的方差估计。

    >>> k.var()
    20221.822015723094
    >>> k.max()
    12400.294578835219
    >>> import statsmodels.api as sm
    >>> sm.robust.scale.mad(k)
    4.7202445521441112e-07
    

    statsmodels 中的默认带宽在这种情况下基于 MAD:

    >>> kde = sm.nonparametric.KDEUnivariate(k)
    >>> kde.fit()
    >>> kde.bw     # selected default bandwidth
    2.3879089644581783e-06
    

    这将匹配接近于零的大量观测值。 您可以在 gaussian_kde 中设置带宽,而不是使用默认带宽。

    但是,对于只有很少的观察并且它们之间的距离很大的尾部,这个带宽将非常小。对于那部分,带宽应该很大。

    但是,gaussian_kde 无法处理自适应带宽,statsmodels 中的内核密度估计器也无法处理。

    【讨论】:

      猜你喜欢
      • 2014-01-17
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多