2

データの大きなストリーム(メモリに収まらない)の任意の分位数を見つける必要があり、結果は再現可能である必要があります。つまり、同じストリームの場合、結果は同じである必要があります。私はこれに子馬を使用してきましたが、結果は再現できません。

これらの要件を満たす別のライブラリはありますか?

分位ビニングの結果をcoltで再現可能にするにはどうすればよいですか(1.2.0を使用しています)?乱数にランダムシードを使用しましたが、子馬が独自のランダム性を導入しているようです。わからない。

2つの異なる実行で次の結果が得られます。それらが再現可能である場合、結果は同じになります。

[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));
    }
}
4

1 に答える 1

1

QuantileBin1DにRandomEngineを提供しないため、まだある程度のランダム性があります。一部のクラス(RandomSamplerは私が最初に見つけたものです)では、デフォルトのRandomEngineが作成されますが、これは再現できないようです。

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

コンストラクターをnewQuantileBin1D(false、Long.MAX_VALUE、0.001、0.0001、64、new DRand());に変更する必要があります。

デフォルトのcern.jet.random.engine.DRandコンストラクターはで文書化されています

定数であるデフォルトのシードを使用して乱数ジェネレーターを構築して返します。

これにより、ランダムでない結果が得られるはずです。

于 2012-09-23T10:14:10.000 に答える