关于分位数估计的可重复性

时间:2012-09-18 15:40:52

标签: java bigdata colt

我需要找到大数据流的任意分位数(不适合存储器),结果需要重复,即对于相同的流,结果应该是相同的。我一直在使用小马,结果不可重复。

那里有另一个图书馆可以通过这些要求吗?

我需要做些什么来使用colt重复分位数分箱的结果(我使用的是1.2.0)?我在随机数中使用了随机种子,但看起来像小马引入了自己的随机性。我想不出来。

我得到两个不同运行的以下结果。如果它们是可重复的,结果将是相同的:

[0.0990242124295947, 0.20014652659912247, 0.2996443961549412]
[0.09994965676310263, 0.20079195488768953, 0.29986981667267676]

以下是生成它的代码:

public class QuantileTest {

    public static void main(String[] args) throws IOException, Exception {
        QuantileBin1D qBins = new QuantileBin1D(false, Long.MAX_VALUE, 0.001, 0.0001, 64, null);
        Random rand = new Random(0);
        for (int i = 0; i < 1500000; i++) {
            double num = rand.nextDouble();;
            qBins.add(num);
        }

        DoubleArrayList qMarks = new DoubleArrayList(new double[] {0.1, 0.2, 0.3});
        double[] xMarks = qBins.quantiles(qMarks).elements();
        System.out.println(Arrays.toString(xMarks));
    }
}

1 个答案:

答案 0 :(得分:1)

由于您没有向QuantileBin1D提供RandomEngine,因此仍然存在一些随机性。在某些类中(RandomSampler是我发现的第一个出现的),将创建一个默认的RandomEngine,它似乎是不可重复的。

if (randomGenerator==null) randomGenerator = cern.jet.random.AbstractDistribution.makeDefaultGenerator();
    this.my_RandomGenerator=randomGenerator;

您应该将构造函数更改为 新的QuantileBin1D(false,Long.MAX_VALUE,0.001,0.0001,64,new DRand());

带有cern.jet.random.engine.DRand

记录的默认构造函数
  

构造并返回一个带有默认种子的随机数生成器,这是一个常量

这会导致非随机结果。