1. ホーム
  2. python

[解決済み] なぜnumpyのstd()はmatlabのstd()と異なる結果を出すのですか?

2023-01-23 22:36:13

質問

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 . に設定します。 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による素晴らしい回答は、さらなる数学的な詳細を与えてくれます。