ArrayStatistics
この特殊なケースに合わせて最適化されているため、実際には配列が必要です (これが ArrayStatistics と呼ばれる理由です)。同様に、StreamingStatistics
データをメモリに保持せずに IEnumerable シーケンス ストリーミング用に最適化されています。すべての種類の入力で機能する一般的なクラスはStatistics
クラスです。
LINQ と StreamingStatistics を使用するだけでは十分に高速ではないことを確認しましたか? わずか 50 個のエントリのリストについてこれらの統計を計算することは、ループで 100 万回実行しない限り、ほとんど測定できません。
Math.NET Numerics v3.0.0-alpha7 の例で、リスト内のタプルを使用してカスタム型をエミュレートします。
using MathNet.Numerics.Statistics;
var data = new List<Tuple<string, double>>
{
Tuple.Create("A", 1.0),
Tuple.Create("B", 2.0),
Tuple.Create("C", 1.5)
};
// using the normal extension methods within `Statistics`
var stdDev1 = data.Select(x => x.Item2).StandardDeviation();
var mean1 = data.Select(x => x.Item2).Mean();
// single pass variant (unfortunately there's no single pass MeanStdDev yet):
var meanVar2 = data.Select(x => x.Item2).MeanVariance();
var mean2 = meanVar2.Item1;
var stdDev2 = Math.Sqrt(meanVar2.Item2);
// directly using the `StreamingStatistics` class:
StreamingStatistics.MeanVariance(data.Select(x => x.Item2));