Wie beschleunigen Sie eine "for" -Schleife, die bei der Ausreißererkennung verwendet wird?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich verwende die folgende "for" -Schleife, um Ausreißer aus einem Datensatz zu erkennen und zu entfernen. Ich importiere die Spalte als Matrix (mBase), weil dadurch andere Probleme gelöst wurden, und führe sie dann durch die Schleife. Hat jemand irgendwelche Empfehlungen, um dies zu beschleunigen? Momentan benötigen 2000 Datensätze 3-4 Sekunden und ich habe 60.000 Datensätze.
Für (i = 1, i <2000 + 1, i ++,
Ob(
mBase > Quantil (0,75, mBase) + 3,95 * (Quantil (0,75, mBase) -
Quantil (0,25, mBase)) | mBase
Quantil (0,75, mBase) - Quantil (0,25, mBase)),
mBase = [.]
)
);
Vielen Dank im Voraus für die Antwort (en).
Matt
Re: Wie beschleunigt man eine "for" -Schleife bei der Ausreißererkennung?Noch schneller: Sie können die gesamte Matrix auf einmal bearbeiten und die Schleife ganz vermeiden.
mBase = mBase: / ((q25 - 3,95 * (q75 - q25)) <= mBase <= (q75 + 3,95 * (q75 - q25)));
: / ist eine elementweise Matrixteilung. Zum Beispiel [10 21]: / [5 3] == [2 7]
Der obige Code nutzt die Tatsache, dass die Division durch 0 einen fehlenden Wert ergibt. Ein allgemeinerer und etwas langsamerer Ansatz ist die Verwendung der Loc () - Funktion.
Locs = Loc (! ((q25 - 3,95 * (q75 - q25)) <= mBase <= (q75 + 3,95 * (q75 - q25))));
mBase [locs] =.;
Re: Wie beschleunigt man eine "for" -Schleife bei der Ausreißererkennung?Das ist viel besser. Danke für die Hilfe.
Re: Wie beschleunigt man eine "for" -Schleife bei der Ausreißererkennung?Das sollte viel schneller sein:
q75 = Quantil (0,75, mBase);
q25 = Quantil (0,25, mBase);
Für (i = 1, i <2000 + 1, i ++,
Wenn (mBase > q75 + 3,95 * (q75 - q25) |
mBase
mBase = [.]
)
);