gpt4 book ai didi

algorithm - 计算大数据集分位数的增量方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:31:01 25 4
gpt4 key购买 nike

我需要计算大量数据的分位数。

假设我们只能通过某些部分(即大矩阵的一行)获取数据。要计算 Q3 分位数,需要获取数据的所有部分并将其存储在某处,然后对其进行排序并计算分位数:

List<double> allData = new List<double>();
// This is only an example; the portions of data are not really rows of some matrix
foreach(var row in matrix)
{
allData.AddRange(row);
}

allData.Sort();
double p = 0.75 * allData.Count;
int idQ3 = (int)Math.Ceiling(p) - 1;
double Q3 = allData[idQ3];

我想找到一种无需将数据存储在中间变量中即可获得分位数的方法。最好的解决方案是在第一行计算中间结果的一些参数,然后在接下来的行中逐步调整它。

注意:

  • 这些数据集非常大(每行约 5000 个元素)
  • Q3 可以估算,不一定是精确值。
  • 我将数据的各个部分称为“行”,但它们可以有不同的长度!通常它变化不大(+/- 几百个样本)但它会变化!

这个问题类似于“On-line” (iterator) algorithms for estimating statistical median, mode, skewness, kurtosis ,但我需要计算分位数。

此外,该主题的文章也很少,即:

在尝试实现这些方法之前,我想知道是否还有其他更快的方法来计算 0.25/0.75 分位数?

最佳答案

我支持使用存储桶的想法。不要将自己限制在 100 个桶 - 还不如使用 100 万个。棘手的部分是选择你的桶范围,这样所有的东西都不会落在一个桶里。估计存储桶范围的最佳方法可能是对数据进行合理的随机抽样,使用简单排序算法计算 10% 和 90% 的分位数,然后生成大小相等的存储桶来填充该范围。它并不完美,但如果您的数据不是来自 super 奇怪的分布,它应该可以工作。

如果您不能进行随机抽样,您的麻烦就更大了。您可以根据您的预期数据分布选择一个初始分桶猜测,然后在处理您的数据时,如果任何分桶(通常是第一个或最后一个分桶)变得过满,则使用新的分桶范围重新开始。

关于algorithm - 计算大数据集分位数的增量方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2837311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com