首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用偏态分布的gaussian_kde?

使用偏态分布的gaussian_kde?
EN

Stack Overflow用户
提问于 2014-01-29 06:29:13
回答 1查看 1K关注 0票数 1

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

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

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

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

代码语言:javascript
运行
复制
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的中位数时,它实际上是零。

有人对此有什么解决方案吗?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2014-01-29 10:37:06

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

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

代码语言:javascript
运行
复制
>>> k.var()
20221.822015723094
>>> k.max()
12400.294578835219
>>> import statsmodels.api as sm
>>> sm.robust.scale.mad(k)
4.7202445521441112e-07

statsmodels中的默认带宽在本例中基于MAD:

代码语言:javascript
运行
复制
>>> kde = sm.nonparametric.KDEUnivariate(k)
>>> kde.fit()
>>> kde.bw     # selected default bandwidth
2.3879089644581783e-06

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

然而,对于只有很少的观测值的尾部来说,这个带宽将非常小,并且它们之间的距离很大。对于这一部分,带宽应该很大。

然而,gaussian_kde不能处理自适应带宽,统计模型中的核密度估计器也不能。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21418277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档