我需要计算大量数据的分位数。
假设我们只能通过某些部分(即大矩阵的一行)获取数据。要计算 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 分位数?