Czy jest wbudowana funkcja numpy, która wykonuje coś podobnego do następującego? Oznacza to, że weź listę d
i zwróć listę filtered_d
z usuniętymi elementami zewnętrznymi na podstawie pewnego zakładanego rozkładu punktów w d
.
import numpy as np
def reject_outliers(data):
m = 2
u = np.mean(data)
s = np.std(data)
filtered = [e for e in data if (u - 2 * s < e < u + 2 * s)]
return filtered
>>> d = [2,4,5,1,6,5,40]
>>> filtered_d = reject_outliers(d)
>>> print filtered_d
[2,4,5,1,6,5]
Mówię „coś podobnego”, ponieważ funkcja może zezwalać na różne rozkłady (poissona, gaussa itp.) I różne progi wartości odstających w tych rozkładach (tak jak m
użyłem tutaj).
Odpowiedzi:
Ta metoda jest prawie identyczna z twoją, tylko bardziej numpyst (działa również tylko na tablicach numpy):
źródło
m
jest dostatecznie duża (np.m=6
), Ale dla małych wartościm
ta obarczona jest średnią wariancją, która nie jest solidnymi estymatorami.W przypadku wartości odstających ważne jest, aby starać się używać estymatorów tak solidnych, jak to tylko możliwe. Średnia rozkładu będzie obciążona wartościami odstającymi, ale np. Mediana będzie znacznie mniejsza.
Opierając się na odpowiedzi eumiro:
Tutaj zastąpiłem średnią bardziej solidną medianą, a odchylenie standardowe medianą bezwzględnej odległości od mediany. Następnie przeskalowałem odległości przez ich (ponownie) medianę, tak aby
m
była na rozsądnej skali względnej.Zauważ, że aby
data[s<m]
składnia działała,data
musi być tablicą numpy.źródło
3.5 / .6745 ~= 5.189
(mnożąs
przez 0,6745 i określająm
3,5 ... również biorąabs(s)
). Czy ktoś może wyjaśnić wybór m? A może jest to coś, co zidentyfikujesz w swoim konkretnym zbiorze danych?m
zamiast puszystych stwierdzeń, takich jak „wzajemne oddziaływanie czystości i wydajności”?TypeError: only integer scalar arrays can be converted to a scalar index
Odpowiedź Benjamina Banniera daje wynik pass-through, gdy mediana odległości od mediany wynosi 0, więc uważam, że ta zmodyfikowana wersja jest nieco bardziej pomocna w przypadkach, jak podano w poniższym przykładzie.
Przykład:
Daje:
źródło
Opierając się na Benjamin's, używając
pandas.Series
i zastępując MAD przez IQR :Na przykład, jeśli ustawisz
iq_range=0.6
, percentyle z międzykwartylowego zasięgu staną:0.20 <--> 0.80
tak więcej odstających zostaną uwzględnione.źródło
Alternatywą jest dokonanie solidnego oszacowania odchylenia standardowego (przy założeniu statystyki Gaussa). Patrząc na kalkulatory online, widzę, że 90% percentyl odpowiada 1,2815σ, a 95% to 1,645σ ( http://vassarstats.net/tabs.html?#z )
Jako prosty przykład:
Wynik, który otrzymuję, to:
Co jest zbliżone do oczekiwanej wartości 2.
Jeśli chcemy usunąć punkty powyżej / poniżej 5 odchyleń standardowych (przy 1000 punktów oczekiwalibyśmy 1 wartość> 3 odchylenia standardowe):
Co daje:
Nie mam pojęcia, które podejście jest bardziej wydajne / solidne
źródło
W tej odpowiedzi chciałbym podać dwie metody, rozwiązanie oparte na „z score” i rozwiązanie oparte na „IQR”.
Kod podany w tej odpowiedzi działa zarówno na pojedynczej
numpy
tablicy dim, jak i na wielunumpy
tablicach.Najpierw zaimportujmy niektóre moduły.
Metoda oparta na punktacji z
Ta metoda sprawdzi, czy liczba wykracza poza trzy odchylenia standardowe. Na podstawie tej reguły, jeśli wartość jest odstająca, metoda zwróci true, jeśli nie, zwróci false.
Metoda oparta na IQR
Ta metoda sprawdzi, czy wartość jest mniejsza
q1 - 1.5 * iqr
lub większa niżq3 + 1.5 * iqr
, co jest podobne do metody wykresu SPSS.Wreszcie, jeśli chcesz odfiltrować wartości odstające, użyj
numpy
selektora.Miłego dnia.
źródło
Weź pod uwagę, że wszystkie powyższe metody zawodzą, gdy odchylenie standardowe staje się bardzo duże z powodu dużych wartości odstających.
( Podobnie jak średnia kalkulacja zawodzi i powinna raczej obliczyć medianę. Chociaż średnia jest „bardziej podatna na taki błąd jak stdDv” ).
Możesz spróbować iteracyjnie zastosować swój algorytm lub filtrować za pomocą zakresu międzykwartylowego: (tutaj „współczynnik” odnosi się do zakresu * sigma, ale tylko wtedy, gdy dane są zgodne z rozkładem Gaussa)
źródło
Chciałem zrobić coś podobnego, z wyjątkiem ustawienia liczby na NaN zamiast usuwania jej z danych, ponieważ jeśli ją usuniesz, zmienisz długość, która może zepsuć wykres (tj. Jeśli usuwasz wartości odstające tylko z jednej kolumny w tabeli , ale potrzebujesz, aby pozostała taka sama jak inne kolumny, aby można było wykreślić je względem siebie).
Aby to zrobić, użyłem funkcji maskujących Numpy :
źródło
jeśli chcesz uzyskać pozycję indeksu wartości odstających
idx_list
, zwróci ją.źródło
Dla zestawu obrazów (każdy obraz ma 3 wymiary), w którym chciałem odrzucić wartości odstające dla każdego piksela, którego użyłem:
Wtedy można obliczyć średnią:
(Używam go do odejmowania w tle)
źródło