numpy std ()가 matlab std ()에 다른 결과를 제공하는 이유는 무엇입니까?


87

나는 matlab 코드를 numpy로 변환하려고 시도하고 numpy가 std 함수와 다른 결과를 가지고 있음을 알아 냈습니다.

MATLAB에서

std([1,3,4,6])
ans =  2.0817

numpy에서

np.std([1,3,4,6])
1.8027756377319946

이것은 정상입니까? 그리고 이것을 어떻게 처리해야합니까?

답변:


145

NumPy 함수 np.stdddof"Delta Degrees of Freedom"과 같은 선택적 매개 변수를 사용 합니다. 기본적으로 이것은입니다 0. 1MATLAB 결과를 얻으려면로 설정하십시오 .

>>> 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의 좋은 대답은 더 많은 수학적 세부 사항을 제공합니다.


4
Matlab에 추가하겠습니다 . std([1 3 4 6],1)NumPy의 기본값과 동일합니다 np.std([1,3,4,6]). 이 모든 것은 Matlab 및 NumPy에 대한 문서에 매우 명확하게 설명되어 있으므로 OP가 나중에 읽을 것을 강력히 권장합니다.
horchler 2014

어느 시점에서이 표준이 변경되었습니다 : np.std () = np.std (ddof = 1), 비록 문서에 np.std ()가 ddof = 0으로 기본 설정되어야한다고 나와 있지만 ...
ColinMac

61

표준 편차는 분산의 제곱근입니다. 랜덤 변수의 분산 X은 다음과 같이 정의됩니다.

분산의 정의

따라서 분산에 대한 추정치는 다음과 같습니다.

편향된 추정기

여기서는 표본 평균표본 평균을 나타냅니다. 무작위로 선택된 xi경우이 추정량은 실제 분산에 수렴하지 않고

편향되지 않은 추정기

표본을 무작위로 선택하고 표본 평균과 분산을 추정하는 경우 수정 된 (편향되지 않은) 추정량을 사용해야합니다.

편향되지 않은 추정기

로 수렴됩니다 시그마 제곱. 수정 항 n-1은 Bessel의 수정이라고도합니다.

이제 기본적으로 MATLABs 는 보정 항을 사용하여 편향되지 않은 추정량을 std계산합니다 . 그러나 NumPy (@ajcr이 설명했듯이) 는 기본적으로 보정 항없이 편향된 추정량을 계산합니다 . 이 매개 변수를 사용하면 수정 기간을 설정할 수 있습니다 . 1로 설정하면 MATLAB에서와 동일한 결과를 얻을 수 있습니다.n-1ddofn-ddof

마찬가지로 MATLAB에서는 "가중 w체계"를 지정 하는 두 번째 매개 변수를 추가 할 수 있습니다 . 기본값 인 w=0은 수정 항 n-1(편향되지 않은 추정량) w=1이되는 반면 ,의 경우 n 만 수정 항 (편향 추정량)으로 사용됩니다.


2
수정 된 추정량에 대한 공식에서 계수 n (합계 내)이 없어야합니다.
Frunobulax

3
분산에서 n-1 항 뒤에있는 직관 : 분산을 근사화하는 데 사용할 평균을 추정하기 위해 이미 표본을 사용했습니다. 이 소개하는 상관 관계 때문에 ddof 1.해야합니다
마티아스

@Frunobulax 후세의 오타를 수정했습니다. 원래 방정식에서 일어난 일은 합의 상한이 제대로 렌더링되지 않았다는 것입니다. n합계 표기법의 맨 위에있는 대신 합계 안에 들어갔습니다.
rayryeng

4

통계가 좋지 않은 사람들을위한 간단한 가이드는 다음과 같습니다.

  • 전체 데이터 세트에서 가져온 샘플을 ddof=1계산 np.std()하는 경우 포함 합니다 .

  • 전체 인구를 ddof=0계산 np.std()하고 있는지 확인

DDOF는 숫자에서 발생할 수있는 편향을 상쇄하기 위해 샘플에 포함됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.