Come accelerare un ciclo "for" utilizzato nel rilevamento di valori anomali?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Io uso il seguente ciclo "for" per rilevare e rimuovere i valori anomali da un set di dati. Importa la colonna come una matrice (mBase) perché questo risolve altri problemi e poi lo esegue attraverso il ciclo. Qualcuno ha qualche raccomandazione per accelerare questo? Attualmente 2000 record richiedono 3-4 secondi e ho a che fare con 60.000 record.
Per (i = 1, i <2000 + 1, i ++,
Se(
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 = [.]
)
);
Grazie in anticipo per la risposta (s).
opaco
Ri: Come accelerare un ciclo "for" usato nel rilevamento di valori anomali?Ancora più veloce: agisci sull'intera matrice in una sola volta ed evita del tutto il ciclo.
mBase = mBase: / ((q25 - 3.95 * (q75 - q25)) <= mBase <= (q75 + 3.95 * (q75 - q25)));
: / è la divisione della matrice element-wise. Ad esempio, [10 21]: / [5 3] == [2 7]
Il codice sopra sfrutta il fatto che la divisione per 0 produce un valore mancante. Un approccio più generale e leggermente più lento consiste nell'utilizzare la funzione Loc ().
locs = Loc (! ((q25 - 3,95 * (q75 - q25)) <= mBase <= (q75 + 3,95 * (q75 - q25))));
mBase [locs] =.;
Ri: Come accelerare un ciclo "for" usato nel rilevamento di valori anomali?Questo è molto migliorato. Grazie per l'aiuto.
Ri: Come accelerare un ciclo "for" usato nel rilevamento di valori anomali?Questo dovrebbe essere molto più veloce:
q75 = quantile (.75, mBase);
q25 = quantile (.25, mBase);
Per (i = 1, i <2000 + 1, i ++,
Se (mBase > q75 + 3,95 * (q75 - q25) |
MBASE
MBASE = [.]
)
);