나는 matlab 코드를 numpy로 변환하려고 시도하고 numpy가 std 함수와 다른 결과를 가지고 있음을 알아 냈습니다.
MATLAB에서
std([1,3,4,6])
ans = 2.0817
numpy에서
np.std([1,3,4,6])
1.8027756377319946
이것은 정상입니까? 그리고 이것을 어떻게 처리해야합니까?
나는 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. 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은 다음과 같이 정의됩니다.

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

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

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

로 수렴됩니다
. 수정 항
은 Bessel의 수정이라고도합니다.
이제 기본적으로 MATLABs 는 보정 항을 사용하여 편향되지 않은 추정량을 std계산합니다 . 그러나 NumPy (@ajcr이 설명했듯이) 는 기본적으로 보정 항없이 편향된 추정량을 계산합니다 . 이 매개 변수를 사용하면 수정 기간을 설정할 수 있습니다 . 1로 설정하면 MATLAB에서와 동일한 결과를 얻을 수 있습니다.n-1ddofn-ddof
마찬가지로 MATLAB에서는 "가중 w체계"를 지정 하는 두 번째 매개 변수를 추가 할 수 있습니다 . 기본값 인 w=0은 수정 항 n-1(편향되지 않은 추정량) w=1이되는 반면 ,의 경우 n 만 수정 항 (편향 추정량)으로 사용됩니다.
n합계 표기법의 맨 위에있는 대신 합계 안에 들어갔습니다.
std([1 3 4 6],1)NumPy의 기본값과 동일합니다np.std([1,3,4,6]). 이 모든 것은 Matlab 및 NumPy에 대한 문서에 매우 명확하게 설명되어 있으므로 OP가 나중에 읽을 것을 강력히 권장합니다.