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ć?
źródło
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ć?
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.
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.Odchylenie standardowe to pierwiastek kwadratowy z wariancji. Wariancja zmiennej losowej
X
jest definiowana jakoZatem 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ącymn-1
. Jednak NumPy (jak wyjaśnił @ajcr) domyślnie oblicza obciążony estymator bez składnika korekcyjnego. Parametrddof
umożliwia ustawienie dowolnego współczynnika korekcjin-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ącegon-1
(estymator nieobciążony), podczas gdy dlaw=1
, tylko n jest używane jako składnik korygujący (estymator obciążony).źródło
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 obliczasznp.std()
dla próbki pobranej z pełnego zbioru danych.Upewnij się
ddof=0
, że obliczasznp.std()
dla całej populacjiDDOF jest dołączany do próbek, aby zrównoważyć błąd, który może wystąpić w liczbach.
źródło