大量のデータセットの分位数を数える必要があります。
一部の部分(つまり、大きな行列の1行)からのみデータを取得できると仮定します。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分位数を数える他のもっと速い方法があるのではないかと思いました。