1. ホーム
  2. python

[解決済み] 標準偏差を効率的に計算するには?

2023-01-31 19:34:13

質問

数値のリストの配列があります。

[0] (0.01, 0.01, 0.02, 0.04, 0.03)
[1] (0.00, 0.02, 0.02, 0.03, 0.02)
[2] (0.01, 0.02, 0.02, 0.03, 0.02)
     ...
[n] (0.01, 0.00, 0.01, 0.05, 0.03)

私がやりたいことは、リストの各インデックスで、すべての配列要素に渡って平均と標準偏差を効率的に計算することです。

平均を計算するために、私は配列を通してループし、リストの与えられたインデックスで値を合計しています。最後に、私は自分の "平均リスト" の各値を次のように割ります。 n で割ります (私は母集団を扱っているのであって、母集団からのサンプルではありません)。

標準偏差を計算するために、平均を計算した後、もう一度ループします。

私は、平均のために一度、そして(平均を得た後)SDのために一度、配列を2回通過することを避けたいと思います。

配列を一度だけ通過して、両方の値を計算するための効率的な方法はありますか?インタープリタ型言語(PerlやPythonなど)または疑似コードでどんなコードでも結構です。

どのように解決するのですか?

答えは、Welfordのアルゴリズムを使うことです。これは、quot;naive methods"の後に非常に明確に定義されています。

これは、他の回答で提案された2パスまたはオンラインの単純二乗和コレクターのいずれよりも数値的に安定しています。 安定性は、いわゆる「"」につながるような、互いに近い値をたくさん持っている場合にのみ、本当に重要になります。 壊滅的なキャンセル 浮動小数点の文献では、「破局的キャンセル」と呼ばれています。

また、分散計算におけるサンプル数 (N) で割ることと N-1 で割ることの違い (二乗偏差) についてブラッシュアップしておくとよいでしょう。 N-1で割ると標本からの分散の不偏推定になりますが、Nで割ると平均的に分散を過小評価します(標本平均と真の平均の間の分散が考慮されないため)。

私はこのトピックについて、以前の値をオンラインで削除する方法を含む、より詳細に踏み込んだ 2 つのブログ エントリを書きました。

javadoc、ソース、ユニットテストはすべてオンラインで見ることができます。