web-dev-qa-db-ja.com

numpy std()がmatlab std()と異なる結果を与えるのはなぜですか?

Matlabコードをnumpyに変換しようとしましたが、numpyはstd関数とは異なる結果になることがわかりました。

matlabで

std([1,3,4,6])
ans =  2.0817

numpyで

np.std([1,3,4,6])
1.8027756377319946

これは正常ですか?そして、これをどのように処理する必要がありますか?

79
gustavgans

NumPy関数 np.std は、オプションのパラメーターddof: "Delta Degrees of Freedom"を取ります。デフォルトでは、これは0です。 MATLABの結果を取得するには、1に設定します。

>>> np.std([1,3,4,6], ddof=1)
2.0816659994661326

もう少しコンテキストを追加するために、分散の計算(その標準偏差は平方根です)では、通常、値の数で除算します。

しかし、より大きな分布からN要素のランダムサンプルを選択し、分散を計算すると、Nで割ると実際の分散が過小評価される可能性があります。これを修正するには、除算する数値を( 自由度 )からN(通常N-1)未満の数値に下げます。 ddofパラメーターを使用すると、指定した量だけ除数を変更できます。

特に指定がない限り、NumPyは分散(ddof=0Nで除算)のbiased推定量を計算します。これは、分布全体で作業する場合に必要なものです(より大きな分布からランダムに選択された値のサブセットではありません)。 ddofパラメーターが指定されている場合、NumPyは代わりにN - ddofで除算します。

MATLABのstdのデフォルトの動作は、N-1で除算することによりサンプル分散のバイアスを修正することです。これにより、標準偏差のバイアスの一部(おそらくすべてではない)が取り除かれます。これは、より大きな分布のランダムサンプルで関数を使用している場合に必要なものです。

@hbadertsによる素敵な答えは、さらに数学的な詳細を提供します。

138
Alex Riley

標準偏差は、分散の平方根です。確率変数Xの分散は次のように定義されます

definition of variance

したがって、分散の推定量は次のようになります。

biased estimator

どこ sample mean サンプル平均を示します。ランダムに選択された xi、この推定量は実際の分散に収束しないが、

unbiased estimator

サンプルをランダムに選択し、サンプルの平均と分散を推定する場合は、修正された(偏りのない)推定量を使用する必要があります。

unbiased estimator

に収束します sigma squared。補正項 n-1 ベッセル補正とも呼ばれます。

現在、デフォルトでは、MATLABs std は、補正項n-1を使用してunbiased推定量を計算します。ただし、NumPyは(@ajcrが説明したように)デフォルトで修正項なしでbiased推定量を計算します。パラメーターddofを使用すると、修正項n-ddofを設定できます。 1に設定すると、MATLABと同じ結果が得られます。

同様に、MATLABでは、「計量スキーム」を指定する2番目のパラメーターwを追加できます。デフォルトのw=0は、補正項n-1(不偏推定量)になりますが、w=1の場合、nのみが補正項(偏推定量)として使用されます。

60
hbaderts

統計が苦手な人のための簡単なガイドは次のとおりです。

  • 完全なデータセットから取得したサンプルのnp.std()を計算している場合は、ddof=1を含めます。

  • 全母集団に対してnp.std()を計算している場合は、ddof=0を確認してください

DDOFは、数値で発生する可能性のあるバイアスを相殺するために、サンプルに含まれています。

3
MJM