我试图在具有4 GB RAM的计算机上使用MATLAB hist
绘制2 GB矩阵。这项行动耗时数小时。有没有办法通过预先排序数据,预先确定bin大小,将数据分成更小的组,在数据添加到bin中时删除原始数据等来提高计算性能?
此外,在绘制数据后,我需要调整分级以确保曲线平滑。这需要重新开始并重新分组原始数据。我假设涉及最少计算的策略是首先使用非常小的bin来对数据进行bin,然后操纵输出的bin大小,而不是重新对原始数据进行分级。在分箱后调整料箱尺寸的最佳方法是什么(假设料箱尺寸只能增长而不缩小)?
答案 0 :(得分:3)
我不喜欢StackOverflow的答案形式的问题“好吧,即使你问怎么做X,你真的不想做X,你真的想做Y,所以这里是Y的解决方案”
但这就是我要在这里做的事情。我认为这种答案在这种罕见的情况下是合理的,因为下面的答案符合统计分析中的合理做法,并且因为它避免了当前面临4 GB数据的问题。
如果要使用非参数密度估算器表示总体分布,并且您希望避免差的计算性能,则 内核密度估算器(KDE) 将比直方图更好地完成工作。
首先,大多数学术和实践统计学家对KDEs与直方图有明显的偏好。在关于这个主题的众多文本中,我认为特别好的是 An introduction to kernel density estimation )
直方图的形状受到选择的强烈影响 箱柜总数;然而,没有权威的技术 计算甚至估计合适的值。 (对此有任何疑问,只需绘制一些数据的直方图,然后在调整分档数量时观察直方图的整个形状。)
直方图的形状受到选择的强烈影响 箱边缘的位置。
直方图给出不平滑的密度估计值。
KDE完全消除了直方图属性2和3.虽然KDE不会产生带有离散区间的密度估计,但仍然必须提供类似的参数“带宽”。
要计算和绘制KDE,您需要传递两个参数值以及数据:
内核函数:最常见的选项(在MATLAB kde函数中都可用)是:uniform,triangle,biweight,triweight,Epanechnikov和normal。其中,高斯(正常)可能是最常用的。
bandwith :bandwith值的选择几乎肯定会对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不需要在画布上映射数千个(任务?)数据点的符号,颜色和特定位置 - 而是绘制一条平滑线。并且因为整个数据集不需要在画布上一次渲染一个点,所以在创建和渲染绘图时不需要存储它们(在内存中!)。