直方图计算效率



我正试图在具有4GB RAM的计算机上使用MATLAB hist绘制2GB矩阵。手术需要几个小时。是否有方法可以通过对数据进行预排序、预先确定存储箱大小、将数据分成更小的组、在将数据添加到存储箱时删除原始数据等方式来提高计算性能?

此外,在绘制数据后,我需要调整装箱以确保曲线平滑。这需要重新开始并重新装入原始数据。我假设涉及最少计算的策略是首先使用非常小的bin对数据进行bin,然后操纵输出的bin大小,而不是重新对原始数据进行bin。装仓后调整仓大小的最佳方法是什么(假设仓大小只能增长而不能收缩)?

我不喜欢表格中StackOverflow问题的答案"好吧,即使你问了如何做X,你也不是真的想做X,而是真的想要做Y,所以这里有一个Y的解决方案"

但这就是我在这里要做的。我认为在这种罕见的情况下,这样的答案是合理的,因为下面的答案符合统计分析中的良好实践,而且它避免了当前摆在你面前的问题,即处理4GB的数据。

如果您想使用非参数密度估计器来表示总体的分布,并且您希望避免较差的计算性能,内核密度估计量(KDE)将比直方图做得更好。

首先,在大多数学术和实践统计学家中,KDE与直方图相比有着明显的偏好。在关于这个主题的众多文本中,我认为特别好的是核密度估计的介绍

KDE优于直方图的原因

  • 直方图的形状受到垃圾箱总数;然而,目前还没有权威的技术计算或甚至估计合适的值。(对此有任何疑问,只需根据一些数据绘制直方图,然后在调整仓数时观察直方图的整个形状的变化。)

  • 直方图的形状受到料仓边缘的位置

  • 直方图给出的密度估计是不平滑

KDE完全消除了直方图属性2和3。尽管KDE不产生离散仓的密度估计,但仍必须提供类似的参数"带宽"。

要计算和绘制KDE,您需要将两个参数值与数据一起传递:

核函数:最常见的选项(在MATLAB kde函数中都可用)是:均匀、三角形、双重、三重、Epanechnikov和法线。其中,高斯(正态)可能是最常用的。

带宽:带宽值的选择几乎肯定会对KDE的质量产生巨大影响。因此,像MATLAB、R等复杂的计算平台包括效用函数(例如,rusk函数或MISE),以估计给定oother参数的带宽。


MATLAB中的KDE

kde.m 是MATLAB中实现kde:的函数

[h, fhat, xgrid] = kde(x, 401);

请注意,在调用kde.m时没有提供bandwidth和kernel。对于bandwidth:kde.m封装了一个用于带宽选择的函数;对于核函数,使用高斯函数。


但是,使用KDE代替直方图会解决或基本上消除2 GB数据集的缓慢性能吗

当然应该。

在您的问题中,您指出滞后性能发生在绘图过程中。KDE不需要映射数千个(任务?)数据点——一个符号、颜色和画布上的特定位置——而是绘制一条平滑的线。因为整个数据集不需要在画布上一次渲染一个点,所以在创建和渲染绘图时,它们不需要存储(在内存中!)。

最新更新