我正在尝试在具有 4 GB RAM 的计算机上使用 MATLAB hist
绘制一个 2 GB 的矩阵。手术需要几个小时。有没有办法通过对数据进行预排序、预先确定 bin 大小、将数据分成更小的组、在数据添加到 bin 时删除原始数据等来提高计算性能?
此外,绘制数据后,我需要调整分箱以确保曲线平滑。这需要重新开始并重新装箱原始数据。我假设涉及最少计算的策略是首先使用非常小的分箱对数据进行分箱,然后操纵输出的分箱大小,而不是重新分箱原始数据。合并后调整 bin 大小的最佳方法是什么(假设 bin 大小只能增加而不能缩小)?
最佳答案
我不喜欢这种形式的 StackOverflow 问题的答案“好吧,即使你问的是如何做 X,你并不是真的想做 X,你真的想做 Y,所以这是 Y 的解决方案”
但这就是我要做的。我认为在这种罕见的情况下这样的答案是合理的,因为下面的答案符合统计分析中的合理做法,并且因为它避免了您当前面临的处理 4 GB datda 的问题。
如果您想使用非参数密度估计器表示总体分布,并且希望避免计算性能不佳,核密度估计器 (KDE) 将比直方图做得更好。
首先,与柱状图相比,大多数学术和实践统计学家明显更喜欢 KDE。在关于这个主题的众多文本中,我认为特别好的是 An introduction to kernel density estimation )
KDE优于直方图的原因
直方图的形状很大程度上受选择的影响 箱子总数;目前还没有权威的技术 计算甚至估计一个合适的值。 (对此有任何疑问,只需根据一些数据绘制直方图,然后观察直方图的整个形状随着您调整 bin 的数量而变化。)
直方图的形状很大程度上受选择的影响 bin 边缘的位置。
直方图给出的密度估计值不平滑。
KDE 完全消除了直方图属性 2 和 3。尽管 KDE 不生成具有离散 bin 的密度估计,但仍必须提供类似参数“带宽”。
要计算和绘制 KDE,您需要随数据一起传入两个参数值:
核函数:最常见的选项(所有都在 MATLAB kde 函数中可用)是:uniform、triangular、biweight、triweight、Epanechnikov 和 normal。其中,高斯(正常)可能是最常用的。
带宽:带宽值的选择几乎肯定会对 KDE 的质量产生巨大影响。因此,复杂的计算平台(如 MATLAB、R 等)包含实用函数(例如 rusk 函数或 MISE)来估计给定其他参数的带宽。
MATLAB 中的 KDE
kde.m 是 MATLAB 中实现 KDE 的函数:
[h, fhat, xgrid] = kde(x, 401);
请注意,调用 kde.m 时不提供带宽和内核。对于 bandwitdh:kde.m 包装了一个用于带宽选择的函数;核函数使用高斯分布。
但是使用 KDE 代替直方图是否会解决或基本上消除给定 2 GB 数据集的非常缓慢的性能?
当然应该。
在您的问题中,您表示性能滞后发生在绘图过程中。 KDE 不需要在 Canvas 上绘制数以千计(任务?)的数据点、符号、颜色和特定位置——而是绘制一条平滑的线。并且由于整个数据集不需要在 Canvas 上一次渲染一个点,因此在创建和渲染绘图时不需要将它们存储(在内存中!)。
关于matlab - 直方图计算效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9725401/