2011-01-01 2 views
11

현재 Python으로 작성된 일부 알고리즘을 다시 구현하는 중입니다. 한 단계는 값 목록의 표준 편차를 계산하는 것입니다. 원래 구현에서는 Apache Math 1.1 라이브러리의 DescriptiveStatistics.getStandardDeviation을 사용합니다. 나는 numpy 1.5의 표준 편차를 사용한다. 문제는 동일한 입력에 대해 서로 다른 결과를 제공한다는 것입니다.Wolfram과 numpy에서 동일한 입력에 대해 다른 표준 편차가 있습니다.

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

내가 제 3의 의견을 얻을 수 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

글쎄, 아파치와 볼프람이 맞다고 말할 수 있겠 니? 그리고 Numpy가 틀렸다는 것은 거의 없습니다. 그래서 당신은 아마 그것을 올바르게 사용하지 않을 것입니다. 우편 번호? –

답변

23

의해 아파치 볼프람 분할 N-1보다 파이썬 수동으로 계산하는 동일한 결과를 얻을 N. 이것은 μ를 추정하기 때문에 자유도 조정 정도입니다. N-1로 나눔으로써 모집단 표준 편차의 비 편향 추정을 얻습니다. ddof 옵션을 사용하여 NumPy의 동작을 변경할 수 있습니다.

이 NumPy와이 문서에서 설명

평균 편차가 일반적으로 계산 x.sum 제곱 인()/N, 여기서 N = LEN (X). 그러나 ddof가 인 경우 N-ddof 제수는 입니다. 표준 통계학 연습에서, ddof = 1은 무한대 집단의 분산에 대한 편향되지 않은 견적을 제공합니다. ddof = 0은 정상적으로 분포 된 변수에 대해 분산의 최대 우도 추정을 제공합니다. 이 함수에서 계산 된 표준 편차 은 추정 분산의 제곱근이므로이므로 ddof = 1 인 경우에도 표준 편차 추정치가 아닌 편차 그 자체입니다.

+2

당신의 대답에 얼마나 행복하게 반응하는지 모르실 것입니다. 감사! –

+2

Wolfram | Alpha에 "population standard deviation"에 대해 NumPy와 동일한 대답을 얻도록 요청할 수 있습니다. – Soumya

관련 문제