gaussian_kde有不正确的分布?

时间:2014-01-28 22:29:13

标签: python matplotlib kernel scipy

我需要对从对数正态分布生成的数据进行核密度估计。我一直在使用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的中值时,它几乎为零。

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

1 个答案:

答案 0 :(得分:2)

是的,在这种情况下,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无法处理自适应带宽,statsmodel中的内核密度估算器也不能。