Est-il un numpy builtin à rejeter les valeurs aberrantes à partir d'une liste
Est-il un numpy builtin de faire quelque chose comme ce qui suit? Qui est, prendre une liste d
et de retourner une liste filtered_d
avec tous les périphériques éléments supprimés selon certains supposé de la distribution des points dans 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]
Je dis "quelque chose comme" parce que la fonction peut permettre pour les différentes distributions (poisson, gauss, etc.) et en variant les valeurs aberrantes, les seuils à l'intérieur de ces distributions (comme le m
j'ai utilisé ici).
- Connexes: Peut scipy.statistiques d'identifier et d'un masque évident valeurs aberrantes?, bien que cette question semble faire face à des situations plus complexes. Pour la simple tâche que vous avez décrit, un package externe semble être exagéré.
- Je pensais que vu le nombre d'objets internes dans la principale bibliothèque numpy qu'il était étrange qu'il n'y avait rien à faire. Il semble comme une chose assez rare pour le faire avec des brutes, des données bruitées.
Vous devez vous connecter pour publier un commentaire.
Cette méthode est presque identique à la vôtre, un peu plus numpyst (également de travailler sur des tableaux numpy uniquement):
m
est suffisamment large (par exemple,m=6
), mais pour de petites valeurs dem
cette souffre de la moyenne, la variance de ne pas être robuste estimateurs.Quelque chose d'important lorsqu'il est question de valeurs aberrantes, c'est que l'on devrait essayer d'utiliser des estimateurs robustes que possible. La moyenne d'une distribution biaisée par les valeurs aberrantes, mais par exemple, la médiane sera beaucoup moins.
Bâtiment sur eumiro réponse:
Ici, j'ai remplacer le dire avec la plus robuste, la médiane et l'écart-type avec la distance absolue par rapport à la médiane. J'ai ensuite mis à l'échelle, les distances par leur (nouveau) valeur médiane de sorte que
m
est raisonnable par rapport à l'échelle.Noter que pour la
data[s<m]
syntaxe fonctionne,data
doit être un tableau numpy.3.5 / .6745 ~= 5.189
(ils se multiplients
par .6745 et spécifier unm
de 3,5...aussi prendreabs(s)
). Quelqu'un peut-il expliquer le choix de m? Ou est-ce quelque chose que vous vous identifier à partir de votre jeu particulier de données?m
dépend de l'ensemble de données d'entrée. Sa valeur en fin de compte, décide de la pureté des données filtrées et l'efficacité de rejet de vrai valeurs aberrantes. Un moyen pour déterminer une bonne valeur serait d'examiner l'interaction de la pureté et de l'efficacité de simulé (formation) des données, et de prendre de la valeur.m
plutôt que de moelleux des phrases comme: "jeu de pureté et d'efficacité"?TypeError: only integer scalar arrays can be converted to a scalar index
def reject_outliers(data, m = 2.): if not isinstance(data, np.ndarray): data = np.array(data) d = np.abs(data - np.median(data)) mdev = np.median(d) s = d/mdev if mdev else 0. return data[s<m]
Benjamin Bannier réponse donne un pass-through lors de la médiane des distances à partir de la médiane est de 0, donc j'ai trouvé cette version modifiée un peu plus utile pour les cas comme dans l'exemple ci-dessous.
Exemple:
Donne:
Bâtiment sur Benjamin, à l'aide de
pandas.Series
, et le remplacement de MAD avec IQR:Par exemple, si vous définissez
iq_range=0.6
, les percentiles de la interquartile range devient:0.20 <--> 0.80
, donc plus valeurs aberrantes seront inclus.Une alternative est de faire une estimation robuste de l'écart-type (en supposant que Gaussien statistiques). Recherche de calculatrices en ligne, je vois que le 90% percentile correspond à 1.2815 σ et l'ic à 95% est 1,645 à σ (http://vassarstats.net/tabs.html?#z)
Comme un simple exemple:
La sortie que je reçois est:
Qui est proche de la valeur attendue de 2.
Si nous voulons supprimer les points au-dessus/en-dessous de 5 écarts-types (avec 1000 points, nous nous attendrions 1 valeur > 3 écarts-types):
Qui donne:
Je n'ai aucune idée de qui est l'approche la plus efficace/solide
J'aimerais donner deux méthodes dans cette réponse, la solution basée sur le "z score" et la solution fondée sur "l'EI".
Le code fourni dans cette réponse, fonctionne à la fois unique dim
numpy
tableau et plusieursnumpy
tableau.Nous allons importer certains modules d'abord.
z score méthode basée sur
Cette méthode permettra de tester si le nombre se situe à l'extérieur de trois écarts-types. Sur cette base, si la valeur est aberrant, la méthode renvoie true, sinon, retourne false.
IQR la méthode basée sur la
Cette méthode permettra de tester si la valeur est inférieure à
q1 - 1.5 * iqr
ou supérieure àq3 + 1.5 * iqr
, qui est similaire à SPSS intrigue de méthode.Enfin, si vous souhaitez filtrer les valeurs aberrantes, l'utilisation d'un
numpy
sélecteur.Avoir une belle journée.
Je voulais faire quelque chose de similaire, à l'exception de la fixation du nombre de NaN, plutôt que de le supprimer de données, car si vous l'enlevez, vous modifiez la longueur qui peut gâcher le traçage (par exemple, si vous êtes seulement enlever les valeurs aberrantes d'une colonne dans une table, mais vous avez besoin qu'il reste le même que les autres colonnes de sorte que vous pouvez tracer les uns contre les autres).
Pour ce faire j'ai utilisé numpy est le masquage des fonctions: