关于分位数估计的可重复性
Posted
技术标签:
【中文标题】关于分位数估计的可重复性【英文标题】:On repeatability of quantile estimates 【发布时间】:2012-09-18 15:40:51 【问题描述】:我需要找到大量数据流的任意分位数(不适合内存),并且结果需要是可重复的,即对于同一个流,结果应该是相同的。为此我一直使用 colt,结果不可重复。
是否还有其他库可以满足这些要求?
我必须做些什么才能使分位数分箱的结果可与 colt 重复(我使用的是 1.2.0)?我在随机数中使用了随机种子,但看起来 colt 引入了自己的随机性。我想不通。
对于两次不同的运行,我得到以下结果。如果它们是可重复的,结果将是相同的:
[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));
【问题讨论】:
您确定这不仅仅是精度问题吗?这些数字非常接近相同,这将是我的直觉。 另外,您已将 epsilon 设置为 0.001。这是永远不会超过的近似误差,看起来你所有的数字实际上在 10^-3 位上都是相等的。如果您不希望 Colt 使用近似值,文档会说使用 0.0 作为您的 epsilon。 如果没有随机性,相同输入的结果将是相同的。如果您实际对所有数字进行了排序,则精度会量化与真实值的差异。可重复性是指无论运行多少次都能获得相同的结果。 【参考方案1】:仍然存在一些随机性,因为您没有向 QuantileBin1D 提供 RandomEngine。在某些类中(RandomSampler 是我发现的第一次出现),将创建一个默认的 RandomEngine,这似乎是不可重复的。
if (randomGenerator==null) randomGenerator = cern.jet.random.AbstractDistribution.makeDefaultGenerator();
this.my_RandomGenerator=randomGenerator;
您应该将构造函数更改为 new QuantileBin1D(false, Long.MAX_VALUE, 0.001, 0.0001, 64, new DRand());
cern.jet.random.engine.DRand
是默认构造函数记录在
构造并返回一个带有默认种子的随机数生成器,该种子是一个常量。
这应该会导致非随机结果。
【讨论】:
以上是关于关于分位数估计的可重复性的主要内容,如果未能解决你的问题,请参考以下文章
R语言编写自定义函数计算R方使用自助法Bootstrapping估计多元回归模型的R方的置信区间可视化获得的boot对象估计单个统计量的置信区间分别使用分位数法和BCa法