我有一堆csv数据集,每个大小约10Gb.我想从他们的列生成直方图.但似乎在numpy中执行此操作的唯一方法是首先将整个列加载到numpy数组中,然后调用numpy.histogram
该数组.这会消耗不必要的内存量.
numpy支持在线分类吗?我希望能够在读取它们的同时逐行迭代我的csv.这种方式在任何时候最多一行都在内存中.
不难自我动手,但想知道是否有人已经发明了这个轮子.
这个问题稍微延伸了这里回答的问题.我正在努力重新实现本文第2.1节中的直方图近似版本,并且我想在再次开始此过程之前连接所有的鸭子.上次,我用过boost::multi_index
,但性能并不是最大的,我想避免插入/发现复杂性的桶数量的对数std::set
.由于我正在使用的直方图的数量(随机森林中随机树的每个叶节点每个特征一个),计算复杂度必须尽可能接近常数.
用于实现直方图的标准技术涉及将输入实际值映射到箱号.要做到这一点,一种方法是:
这适用于具有统一箱尺寸的直方图,并且非常有效.然而,上面链接的论文的2.1节提供了没有统一的箱尺寸的直方图算法.
另一个问题是,简单地将输入实际值乘以一个因子,并使用得到的产品作为索引,以负数表示失败.为了解决这个问题,我考虑在数组中的某处识别一个'0'bin.这个箱子将以0.0为中心; 它上面/下面的垃圾箱可以使用刚才解释的相同的乘法和平面方法计算,稍作修改,将地板产品加到两个或根据需要减去两个.
然后,这引出了合并的问题:本文中的算法合并了两个最接近的箱,从中心到中心测量.在实践中,这会产生"锯齿状"直方图近似值,因为某些箱子会有非常大的数量,而其他箱子则不会.当然,这是由于不均匀尺寸的箱,并且不会导致任何精度损失.然而,如果我们试图将非均匀尺寸的箱子标准化以制造均匀,则会发生精度损失.这是因为假设m/2样本落在bin中心的左侧和右侧,其中m = bin计数.我们可以将每个bin建模为高斯,但这仍然会导致精度损失(尽管很小)
这就是我现在被困住的地方,导致了这个主要问题:实现直方图接受流数据并将每个样本存储在统一大小的容器中的最佳方法是什么?