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

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

MATLAB에서

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

numpy에서

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

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



답변

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


답변

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

분산의 정의

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

편향된 추정기

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

편향되지 않은 추정기

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

편향되지 않은 추정기

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

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

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


답변

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

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

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

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


답변