Próbuję przekonwertować kod Matlab na numpy i odkryłem, że numpy ma inny wynik z funkcją std.
w matlab
std([1,3,4,6])
ans = 2.0817
w numpy
np.std([1,3,4,6])
1.8027756377319946
Czy to normalne? Jak mam sobie z tym poradzić?
Próbuję przekonwertować kod Matlab na numpy i odkryłem, że numpy ma inny wynik z funkcją std.
w matlab
std([1,3,4,6])
ans = 2.0817
w numpy
np.std([1,3,4,6])
1.8027756377319946
Czy to normalne? Jak mam sobie z tym poradzić?
Odpowiedzi:
Funkcja NumPy np.std
przyjmuje opcjonalny parametr ddof
: „Delta Degrees of Freedom”. Domyślnie jest to 0
. Ustaw go na, 1
aby uzyskać wynik MATLAB:
>>> np.std([1,3,4,6], ddof=1)
2.0816659994661326
Aby dodać trochę więcej kontekstu, podczas obliczania wariancji (której odchylenie standardowe jest pierwiastkiem kwadratowym) zazwyczaj dzielimy przez liczbę posiadanych wartości.
Ale jeśli wybierzemy losową próbkę N
elementów z większego rozkładu i obliczymy wariancję, dzielenie przez N
może prowadzić do niedoszacowania rzeczywistej wariancji. Aby to naprawić, możemy obniżyć liczbę, którą dzielimy ( stopnie swobody ) do liczby mniejszej niż N
(zwykle N-1
). ddof
Parametr pozwala nam zmienić dzielnik o kwotę możemy określić.
O ile nie podano inaczej, NumPy obliczy obciążony estymator dla wariancji ( ddof=0
dzieląc przez N
). To jest to, czego potrzebujesz, jeśli pracujesz z całym rozkładem (a nie podzbiorem wartości, które zostały losowo wybrane z większego rozkładu). Jeśli ddof
podano parametr, NumPy dzieli N - ddof
zamiast tego.
Domyślnym zachowaniem MATLAB-ów std
jest skorygowanie odchylenia dla wariancji próbki przez podzielenie przez N-1
. Pozwala to pozbyć się części (ale prawdopodobnie nie wszystkich) błędu odchylenia standardowego. To prawdopodobnie jest to, czego chcesz, jeśli używasz funkcji na losowej próbce większej dystrybucji.
Miła odpowiedź @hbaderts podaje dalsze matematyczne szczegóły.
Odchylenie standardowe to pierwiastek kwadratowy z wariancji. Wariancja zmiennej losowej X
jest definiowana jako
Zatem estymatorem wariancji byłby
gdzie oznacza średnią próbki. Dla losowo wybranych można wykazać, że estymator ten nie jest zbieżny do wariancji rzeczywistej, ale do
Jeśli losowo wybierzesz próbki i oszacujesz średnią próbki i wariancję, będziesz musiał użyć skorygowanego (nieobciążonego) estymatora
które zbiegną się do . Składnik korygujący jest również nazywany poprawką Bessela.
Teraz MATLABs domyślnie std
oblicza nieobciążony estymator ze składnikiem korygującym n-1
. Jednak NumPy (jak wyjaśnił @ajcr) domyślnie oblicza obciążony estymator bez składnika korekcyjnego. Parametr ddof
umożliwia ustawienie dowolnego współczynnika korekcji n-ddof
. Ustawiając go na 1, otrzymasz taki sam wynik jak w MATLAB.
Podobnie MATLAB pozwala na dodanie drugiego parametru w
określającego „schemat ważenia”. Wartość domyślna, w=0
powoduje powstanie składnika korygującego n-1
(estymator nieobciążony), podczas gdy dla w=1
, tylko n jest używane jako składnik korygujący (estymator obciążony).
n
iść na górę notacji sumowania, wszedł do sumy.
Dla osób, które nie radzą sobie ze statystykami, uproszczony przewodnik to:
Uwzględnij, ddof=1
jeśli obliczasz np.std()
dla próbki pobranej z pełnego zbioru danych.
Upewnij się ddof=0
, że obliczasz np.std()
dla całej populacji
DDOF jest dołączany do próbek, aby zrównoważyć błąd, który może wystąpić w liczbach.
std([1 3 4 6],1)
jest odpowiednikiem domyślnego NumPynp.std([1,3,4,6])
. Wszystko to jest dość jasno wyjaśnione w dokumentacji dla Matlab i NumPy, więc zdecydowanie zalecam, aby OP, koniecznie zapoznał się z nimi w przyszłości.