2011-01-01 14 views
11

現在、PythonでJavaで書かれたアルゴリズムを再実装しようとしています。 1つのステップは、値リストの標準偏差を計算することです。元の実装では、このためにApache Math 1.1ライブラリのDescriptiveStatistics.getStandardDeviationが使用されています。私はnumpy 1.5の標準偏差を使用します。問題は、同じ入力に対して(非常に)異なる結果を与えることです。Wolframとnumpyからの同じ入力に対する標準偏差が異なる

numpy   : 0.10932134388775223 
Apache Math 1.1 : 0.12620366805397404 
Wolfram Alpha : 0.12620366805397404 

が、私は第三の意見を得るためにWolfram Alphaでチェック:私は次のような結果を得る

[0.113967640255, 0.223095775796, 0.283134228235, 0.416793887842] 

:私が持っているサンプルはこれです。私はそのような違いが単なる精度で説明できるとは思わない。なぜこれが起こっているのか誰にも分かりませんが、私はそれについて何ができるでしょうか?

編集は約右のそれを使用しない、また

>>> from math import sqrt 
>>> v = [0.113967640255, 0.223095775796, 0.283134228235, 0.416793887842] 
>>> mu = sum(v)/4 
>>> sqrt(sum([(x - mu)**2 for x in v])/4) 
0.10932134388775223 

>>> from numpy import std 
>>> std([0.113967640255, 0.223095775796, 0.283134228235, 0.416793887842]) 
0.10932134388775223 
+0

ApacheとWolframが正しいとお伝えしますか?そしてナンシーが間違っているとは思わない。あなたはおそらくそれを正しく使用していないでしょう。郵便番号? –

答えて

23

によってApacheとのWolfram分割N-1はなく、Pythonで手動で計算すると同じ結果を与えますこれは、あなたがμを推定するので、自由度の調整です。 N-1で割ることで、母集団の標準偏差の不偏推定を得る。 NumPyの動作は、ddofオプションを使用して変更できます。

これはnumpyのドキュメントに記載されている:

平均偏差が 通常x.sum()/ N、 N = LEN(X)として算出される二乗。ただし、ddofが である場合、除数N-ddofは代わりに です。標準統計では、 の練習では、ddof = 1は、 無限の母集団の分散の偏りの推定値を提供します。 ddof = 0は、 変数の 分散の最尤推定値 を提供します。この関数で計算された標準偏差 は、推定分散の平方根の であり、したがって、ddof = 1であっても、 偏差自体の バイアス推定値ではありません。

+2

あなたの答えがどれほどうれしいか分かりません。ありがとう! –

+2

Wolfram | Alphaに「母集団標準偏差」について質問して、NumPyと同じ回答を得ることができます。 – Soumya

関連する問題