我需要爲大數據集計數分位數。大數據集計數分位數的遞增方式
我們假設我們只能通過某些部分(即大矩陣的一行)獲取數據。要算上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];
我想找到獲得位數的方式,而不存儲數據在一箇中間變量中。最好的解決方案是計算第一行的中間結果的一些參數,然後逐步調整它以用於下一行。
注:
- 這些數據集是真正的大(每行中的CA 5000元)
- 的Q3可以估算,它並沒有成爲一個精確值。
- 我稱之爲數據「行」的部分,但他們可以有不同的leghts!通常它變化不大(+/-幾百個樣本),但它有所不同!
這個問題類似於「On-line」 (iterator) algorithms for estimating statistical median, mode, skewness, kurtosis,但我需要計算分位數。
也有這個主題的幾篇文章,即:
- An Efficient Algorithm for the Approximate Median Selection Problem
- Incremental quantile estimation for massive tracking
之前試圖執行這些方法,我想知道是否有可能任何其他更快的方式計算0.25/0.75分位數?
。很多文獻都是由數據庫研究激發的。 – Ron 2010-05-15 00:59:16
[檢查此主題](http://stats.stackexchange.com/questions/7959/algorithm-to-dynamically-monitor-quantiles/70905) – Quartz 2014-09-10 09:21:29