Comment accélérer une boucle "for" utilisée dans la détection des valeurs aberrantes?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />J'utilise la boucle "for" suivante pour détecter et supprimer les valeurs éloignées d'un ensemble de données. J'importe la colonne en tant que matrice (mBase) car cela résout d'autres problèmes, puis je l'exécute en boucle. Quelqu'un at-il des recommandations pour accélérer le processus? Actuellement, 2000 enregistrements prennent 3-4 secondes et je traite avec 60 000 enregistrements.
Pour (i = 1, i <2000 + 1, i ++,
Si(
mBase > Quantile (0,75, mBase) + 3,95 * (Quantile (0,75, mBase) -
Quantile (0,25, mBase)) | mBase
Quantile (0,75, mBase) - Quantile (0,25, mBase)),
mBase = [.]
)
)
Merci d'avance pour la réponse.
Mat
Re: Comment accélérer une boucle "for" utilisée dans la détection des valeurs aberrantes?Encore plus rapidement: utilisez la totalité de la matrice en une fois et évitez la boucle.
mBase = mBase: / ((q25 - 3,95 * (q75 - q25)) <= mBase <= (q75 + 3,95 * (q75 - q25)));
: / est la division matricielle par élément. Par exemple, [10 21]: / [5 3] == [2 7]
Le code ci-dessus tire parti du fait que la division par 0 génère une valeur manquante. Une approche plus générale et légèrement plus lente consiste à utiliser la fonction Loc ().
locs = Loc (! ((q25 - 3,95 * (q75 - q25)) <<= (q75 + 3,95 * (q75 - q25))));
mBase [locs] =.;
Re: Comment accélérer une boucle "for" utilisée dans la détection des valeurs aberrantes?C'est beaucoup amélioré. Merci pour l'aide.
Re: Comment accélérer une boucle "for" utilisée dans la détection des valeurs aberrantes?Cela devrait être beaucoup plus rapide:
q75 = quantile (0,75, mBase);
q25 = quantile (0,25, mBase);
Pour (i = 1, i <2000 + 1, i ++,
Si (mBase > q75 + 3.95 * (q75 - q25) |
mBase
mBase = [.]
)
)