【问题标题】:Calculating quantiles without storing计算分位数而不存储
【发布时间】:2016-04-01 00:31:35
【问题描述】:

我编写了 C++ 代码来计算 1 亿个双精度数字的 119 个分位数(从 10^-7 到 1 - 10^-7)。 我当前的实现将数字存储在向量中,然后对向量进行排序。 有什么方法可以在不存储数字的情况下计算分位数?

谢谢

附录(对不起我的英语): 这是我正在做的事情:

1) 在[0, 1)中生成20个均匀分布的随机数

2) 我将这些数字输入到一个算法中,该算法输出一个具有未知均值和未知方差的随机数

3) 在第 2 步存储号码

重复 1、2 和 3 1 亿次(现在我收集了 10^8 个具有未知均值和未知方差的随机数)。

现在我使用公式“R-2,SAS-5”对这些数字进行排序,以计算从 10^-7 到 1 - 10^-7 的 119 个分位数: https://en.wikipedia.org/wiki/Quantile#Estimating_quantiles_from_a_sample

由于程序是多线程的,内存分配太大,我只能用5个线程而不是8个。

【问题讨论】:

  • 但是如果您不存储这些数字,您以后将如何检索它们?你到底想做什么?
  • 有一种众所周知的方法可以通过使用堆来找到分布的中位数。看看你的具体问题是否适用于类似的问题?
  • @Carlos 但是你需要将数字存储在堆中,不是吗?
  • 你的意思是“不存储”还是“不排序”?
  • @RedX:计算集合的最小值/最大值可以在不存储数字的情况下完成。这个问题是关于概括的。

标签: c++ algorithm quantile


【解决方案1】:

这是来自streaming algorithms 领域的问题(您需要在不存储每个元素的情况下对数据流进行操作)。

分位数流算法有众所周知的算法(例如,here),但如果您愿意使用分位数近似,这是一个相当简单的问题。只需使用reservoir samplingn 元素中均匀采样 m,并计算样本上的分位数(通过您所做的方法:存储 m em> 向量中的样本,并对其进行排序)。 m 的大小会影响近似值的精度(参见,例如,here)。

【讨论】:

  • 我不确定是否理解“ency.pdf”,因为它似乎建议存储大小为 m 的子样本,但我生成 10^8 个随机数,因为我需要可能的最佳估计的分位数。我还尝试了 q-digest 算法,但在这种情况下它也“压缩”了样本。有没有使用all这10^8个数字的简单程序?
  • @Cristiano 我稍后再看看。
【解决方案2】:

在计算分位数之前,您需要知道一组数字。

这可以通过存储数字来完成,但您也可以制作/使用多遍算法,每次运行都会学习一小部分。

如果分位数上的一些不准确是可以接受的,那么对于这个问题也有近似的一次性算法。这是一个例子:http://www.cs.umd.edu/~samir/498/manku.pdf

编辑**忘记了,如果您的号码有很多重复项,您只需要存储号码以及它出现的次数,而不是每个重复项。根据输入数据,这可能会有很大的不同。

【讨论】:

    猜你喜欢
    • 2012-10-07
    • 2017-05-09
    • 2017-07-24
    • 1970-01-01
    • 2017-11-04
    • 2020-06-06
    • 2011-11-01
    • 2011-12-29
    • 2013-06-20
    相关资源
    最近更新 更多