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


87

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

matlabで

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

numpyで

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

これは正常ですか?そして、私はこれをどのように扱うべきですか?

回答:


145

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

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

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

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

特に明記されていない限り、NumPyは分散のバイアス推定量を計算します(ddof=0、で除算しますN)。これは、ディストリビューション全体(より大きなディストリビューションからランダムに選択された値のサブセットではない)で作業している場合に必要なものです。ddofパラメータが指定されている場合、NumPyはN - ddof代わりにで除算します。

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

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


4
これをMatlabに追加しstd([1 3 4 6],1)ますnp.std([1,3,4,6])。これは、NumPyのデフォルトと同等です。これらはすべて、MatlabとNumPyのドキュメントで非常に明確に説明されているため、OPが将来それらを必ず読むことを強くお勧めします。
horchler 2014

いくつかの点で、この規格が変更されました:np.std()= np.std(DDOF = 1)を、ドキュメントが(そのnp.stdを言うにもかかわらず)DDOF = 0 ...をデフォルトとすべきである
ColinMac

61

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

分散の定義

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

バイアス推定量

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

不偏推定量

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

不偏推定量

これはに収束しシグマ二乗ます。補正項n-1は、ベッセルの補正とも呼ばれます。

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

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


2
修正された推定量の式では、係数n(合計内)が存在してはなりません。
frunobulax 2016

3
分散のn-1項の背後にある直感:分散を概算するために使用する平均を推定するためにサンプルをすでに使用しました。これにより相関関係が導入されるため、ddofは1でなければなりません。–
Matthias

@Frunobulax後世のためのタイプミスを修正しました。元の方程式で起こったことは、合計の上限が適切にレンダリングされていなかったことです。n合計表記の先頭に移動する代わりに、合計の内側に移動しました。
rayryeng 2017年

4

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

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

  • 全人口をddof=0計算np.std()しているかどうかを確認します

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.