値のセットの中央値、最頻値、歪度、および/または尖度を推定するアルゴリズムはありますが、すべての値を一度にメモリに保存する必要はありませんか?
基本的な統計を計算したいのですが:
- 平均:算術平均
- 分散:平均からの偏差の2乗の平均
- 標準偏差:分散の平方根
- 中央値:数値の大きい方の半分を小さい方の半分から分離する値
- モード:セットで見つかった最も頻繁な値
- 歪度:tl; 博士
- 尖度:tl; 博士
これらのいずれかを計算するための基本的な式は、小学校の算数であり、私はそれらを知っています。それらを実装する多くの統計ライブラリもあります。
私の問題は、処理しているセット内の値の数が多い(数十億)ことです。Pythonで作業していると、数十億の要素でリストやハッシュを作成することはできません。これをCで書いたとしても、10億要素の配列はあまり実用的ではありません。
データはソートされていません。他のプロセスによって、オンザフライでランダムに生成されます。各セットのサイズは非常に可変であり、サイズは事前にわかりません。
セット内の各値を任意の順序で反復して、平均と分散をかなりうまく処理する方法をすでに理解しました。(実際、私の場合は、生成された順序でそれらを取得します。)これが私が使用しているアルゴリズムです。礼儀http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm:
- count、sum、sum_of_squaresの3つの変数を初期化します
- 各値について:
- インクリメントカウント。
- 合計に値を追加します。
- 値の2乗をsum_of_squaresに追加します。
- 合計をカウントで除算し、変数の平均として保存します。
- sum_of_squaresをカウントで除算し、変数mean_of_squaresとして格納します。
- 二乗平均、square_of_meanとして保存。
- mean_of_squaresからsquare_of_meanを減算し、分散として保存します。
- 出力の平均と分散。
この「オンライン」アルゴリズムには弱点があります(たとえば、sum_of_squaresが整数範囲または浮動小数点精度よりも急速に大きくなるための精度の問題)が、基本的に、各セットにすべての値を格納する必要がなく、必要なものが得られます。
しかし、追加の統計(中央値、最頻値、歪度、尖度)を推定するための同様の手法が存在するかどうかはわかりません。N値を処理するために必要なメモリがO(N)よりも大幅に少ない限り、偏りのある推定量、またはある程度精度を損なう方法でさえ生きることができます。
ライブラリにこれらの操作の1つ以上を「オンライン」で計算する関数がある場合は、既存の統計ライブラリを指すことも役立ちます。