Python自适应直方图宽度

时间:2015-08-03 18:22:23

标签: python numpy

我目前正在开展一个项目,我必须将其归结为10维数据。这对numpy.histogramdd完全没问题,但是有一个有严重的障碍:

我的参数空间非常大,但实际上只有一小部分存在于数据中(例如,可能只有几个%左右......)。在这些地区,数据非常丰富,所以我想使用相对较小的箱宽。然而,这里的问题是RAM的使用完全爆炸。我看到只有5个尺寸使用20GB +,这已经绝对不实用了。我自己尝试定义网格,但问题仍然存在......

我的想法是手动指定bin边缘,其中我只使用非常大的bin宽度用于数据空间中的空区域。只有在我实际拥有数据的地区,我才需要更精细的规模。

我想知道这里是否有人知道这种实现已经在任意数量的维度上工作。

谢谢

1 个答案:

答案 0 :(得分:1)

我认为您应首先重新映射数据,然后创建直方图,然后在知道值已转换的情况下解释直方图。一种可能性是调整直方图刻度标签,以便它们显示映射值。

例如,一种可行的方法是:

  1. 将一维数据排序为一维数组;
  2. 整合此数组,因此您有累积分布;
  3. 找到此分布中最陡峭的部分,并选择与" good"相对应的水平间隔。直方图峰值的bin大小 - 即,提供良好分辨率的大小;
  4. 沿垂直轴查找此相同间隔的大小。这将为您提供沿垂直轴应用的箱尺寸;
  5. 使用该bin的垂直跨度创建bin - 即" draw"用于创建箱子的水平等距线,而不是绘制垂直箱子的最常用方式;
  6. 这样,你会有很多数据更密集的垃圾箱,以及数据更稀疏的垃圾箱。

    需要考虑两件事:

    1. 映射函数是沿该维度排序的值的累积分布。这可能是非常随意的。如果分布类似于一些众所周知的代数函数,则可以用数学方法定义它并用它来实现实际值数据和"自适应"之间的双向转换。直方图数据;
    2. 这仅适用于一个维度。必须注意如果要组合多个维度的直方图,这将如何工作。