나는 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
. 1
MATLAB 결과를 얻으려면로 설정하십시오 .
>>> 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-1
ddof
n-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가 나중에 읽을 것을 강력히 권장합니다.