2014-12-22 15 views

Odpowiedz

114

Funkcja NumPy np.std przyjmuje opcjonalny parametr ddof: "Delta Degrees of Freedom". Domyślnie jest to 0. Ustawić go 1 aby uzyskać wynik MATLAB:

>>> np.std([1,3,4,6], ddof=1) 
2.0816659994661326 

dodać trochę więcej kontekstu, w celu obliczenia wariancji (z których odchylenie standardowe to pierwiastek kwadratowy) mamy zazwyczaj podzielić przez liczbę wartości, które mieć.

Ale jeśli wybierzemy losową próbkę z elementów N z większej dystrybucji i obliczymy wariancję, dzielenie przez N może prowadzić do zaniżenia rzeczywistej wariancji. Aby to naprawić, możemy obniżyć liczbę dzieloną przez (the degrees of freedom) na liczbę mniejszą niż N (zwykle N-1). Parametr ddof pozwala nam zmienić dzielnik o określoną przez nas wartość.

Jeśli nie powiedziano inaczej, NumPy oblicza ukośny estymatora wariancji (ddof=0 dzieląc przez N). Właśnie tego chcesz, jeśli pracujesz z całą dystrybucją (a nie podzbiorem wartości, które zostały losowo wybrane z większej dystrybucji). Jeśli podany zostanie parametr ddof, NumPy podzieli się na N - ddof.

Domyślnym zachowaniem parametru std MATLAB jest skorygowanie odchylenia o wariancję próbki przez podzielenie przez N-1. To pozbawia niektóre (ale prawdopodobnie nie wszystkie) odchylenia w odchyleniu standardowym. Jest to prawdopodobnie to, czego chcesz, jeśli używasz funkcji na losowej próbce o większej dystrybucji.

Przyjemna odpowiedź @hbadertsa zawiera dodatkowe szczegóły matematyczne.

+3

Dodam, że w Matlab, 'std ([1 3 4 6], 1)' jest równoważne domyślnemu NumPy 'np.std ([1,3,4,6])'. Wszystko to jest dość jasno wyjaśnione w dokumentacji dla Matlaba i NumPy, więc zdecydowanie zalecam, aby OP był w przyszłości czytany. – horchler

51

Odchylenie standardowe jest pierwiastkiem kwadratowym wariancji. Wariancja zmiennej losowej X jest zdefiniowana jako

definition of variance

Estymator różniącym byłoby zatem

biased estimator

gdzie sample mean oznacza próbkę chodzi.Dla losowo wybrany xi, jeżeli można wykazać, że estymator nie są zbieżne z rzeczywistym wariancji, ale

unbiased estimator

Jeśli losowo wybrać próbki i oszacować próbki średniej i wariancji, trzeba będzie użyć poprawione (nieobciążony) estymator

unbiased estimator

które będą zbliżać się do sigma squared. Termin korekty n-1 jest również nazywany korektą Bessela.

Teraz domyślnie MATLABs std oblicza bezstronnej prognozy z terminem korekcyjnym n-1. Jednak NumPy (jak wyjaśnił @ajcr) oblicza oszacowany estymator bez domyślnego terminu korekcji. Parametr ddof pozwala ustawić dowolny składnik korekcji n-ddof. Ustawiając go na 1 uzyskujesz ten sam wynik, co w MATLAB.

Podobnie, MATLAB pozwala dodać drugi parametr w, który określa "schemat ważenia". Domyślnie, w=0, powstaje korekta n-1 (oszacowanie nieobciążone), podczas gdy dla w=1, tylko n jest stosowane jako składnik korekcji (estymator nieobiektywizowany).

+2

We wzorze na poprawiony estymator współczynnik * n * (w ramach kwoty) nie powinien być obecny. – Frunobulax

+2

Intuicja za terminem n-1 w wariancji: już użyłeś swoich próbek do oszacowania średniej, której użyjesz do przybliżenia wariancji. Wprowadza to korelację, a zatem ddof musi być 1. – Matthias

+0

@Frunobulax Naprawiłem literówkę dla potomności. To, co wydarzyło się w oryginalnym równaniu, to to, że górna granica sumy nie była prawidłowo renderowana. Zamiast "n" przechodzącego na szczyt notacji sumującej, weszła ona do sumy. – rayryeng

1

Dla ludzi, którzy nie są idealne ze statystyką, uproszczone przewodnik jest:

  • Dołącz ddof=1 jeśli obliczenia np.std() dla próbki pobranej z pełnego zestawu danych.

  • Zapewnienie ddof=0 jeśli obliczenia np.std() dla pełnego populacji

DDOF dołączonej do próbek w celu zrównoważenia nastawienie, które mogą pojawić się w liczbach.