matlabコードをnumpyに変換しようとすると、numpyの結果がstd関数とは異なることがわかりました。
matlabで
std([1,3,4,6])
ans = 2.0817
numpyで
np.std([1,3,4,6])
1.8027756377319946
これは正常ですか?そして、私はこれをどのように扱うべきですか?
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
「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による良い答えは、さらに数学的な詳細を提供します。
標準偏差は分散の平方根です。確率変数の分散X
は次のように定義されます。
したがって、分散の推定量は次のようになります。
ここで、はサンプル平均を示します。ランダムに選択された場合、この推定量は実際の分散に収束しないが、
サンプルをランダムに選択し、サンプルの平均と分散を推定する場合は、修正された(バイアスのない)推定量を使用する必要があります。
これはに収束します。補正項は、ベッセルの補正とも呼ばれます。
現在、デフォルトでは、MATLABは補正項を使用して不偏推定量をstd
計算しますn-1
。ただし、NumPyは(@ajcrが説明したように)デフォルトで補正項なしでバイアス推定量を計算します。このパラメータをddof
使用すると、任意の補正項を設定できますn-ddof
。1に設定すると、MATLABと同じ結果が得られます。
同様に、MATLABではw
、「計量スキーム」を指定する2番目のパラメーターを追加できます。デフォルトの、w=0
は、補正項n-1
(バイアスのない推定量)になりますがw=1
、の場合、nのみが補正項(バイアスのある推定量)として使用されます。
n
合計表記の先頭に移動する代わりに、合計の内側に移動しました。
std([1 3 4 6],1)
ますnp.std([1,3,4,6])
。これは、NumPyのデフォルトと同等です。これらはすべて、MatlabとNumPyのドキュメントで非常に明確に説明されているため、OPが将来それらを必ず読むことを強くお勧めします。