Matlabコードをnumpyに変換しようとしましたが、numpyはstd関数とは異なる結果になることがわかりました。
matlabで
std([1,3,4,6])
ans = 2.0817
numpyで
np.std([1,3,4,6])
1.8027756377319946
これは正常ですか?そして、これをどのように処理する必要がありますか?
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=0
、N
で除算)のbiased推定量を計算します。これは、分布全体で作業する場合に必要なものです(より大きな分布からランダムに選択された値のサブセットではありません)。 ddof
パラメーターが指定されている場合、NumPyは代わりにN - ddof
で除算します。
MATLABのstd
のデフォルトの動作は、N-1
で除算することによりサンプル分散のバイアスを修正することです。これにより、標準偏差のバイアスの一部(おそらくすべてではない)が取り除かれます。これは、より大きな分布のランダムサンプルで関数を使用している場合に必要なものです。
@hbadertsによる素敵な答えは、さらに数学的な詳細を提供します。
標準偏差は、分散の平方根です。確率変数X
の分散は次のように定義されます
したがって、分散の推定量は次のようになります。
どこ サンプル平均を示します。ランダムに選択された 、この推定量は実際の分散に収束しないが、
サンプルをランダムに選択し、サンプルの平均と分散を推定する場合は、修正された(偏りのない)推定量を使用する必要があります。
に収束します 。補正項 ベッセル補正とも呼ばれます。
現在、デフォルトでは、MATLABs std
は、補正項n-1
を使用してunbiased推定量を計算します。ただし、NumPyは(@ajcrが説明したように)デフォルトで修正項なしでbiased推定量を計算します。パラメーターddof
を使用すると、修正項n-ddof
を設定できます。 1に設定すると、MATLABと同じ結果が得られます。
同様に、MATLABでは、「計量スキーム」を指定する2番目のパラメーターw
を追加できます。デフォルトのw=0
は、補正項n-1
(不偏推定量)になりますが、w=1
の場合、nのみが補正項(偏推定量)として使用されます。
統計が苦手な人のための簡単なガイドは次のとおりです。
完全なデータセットから取得したサンプルのnp.std()
を計算している場合は、ddof=1
を含めます。
全母集団に対してnp.std()
を計算している場合は、ddof=0
を確認してください
DDOFは、数値で発生する可能性のあるバイアスを相殺するために、サンプルに含まれています。