假设我们只能通过某些部分(例如大矩阵的一行)获取数据。要计算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可以估计,不必是精确值。
我将数据的部分称为“行”,但它们的长度可能不同!通常变化不大(±几百个样本),但会有所变化!
这个问题类似于“在线”(迭代器)算法用于估计统计中位数、模式、偏度和峰度, 但我需要计算分位数。
此外,这个主题中还有一些文章,例如: 一个近似中位数选择问题的有效算法 大规模跟踪的增量分位数估计 在尝试实现这些方法之前,我想知道是否还有其他更快的计算0.25/0.75分位数的方法?