2016-07-05 1 views
2

Je me sers de ce Stackoverflow answer pour éliminer les valeurs aberrantes d'un ensemble de données à une magnitude de 1.Suppression Basse Outliers en PHP

Cela fonctionne très bien pour enlever un grand nombre, mais il ne supprime pas les valeurs aberrantes inférieurs. De l'ensemble de données suivant par exemple: (0, 1, 344, 345, 10000) il garderait 0, 1 quand je voudrais les enlever.

Comment puis-je modifier le code à partir de la réponse liée ci-dessus pour supprimer également les valeurs aberrantes inférieures?

Répondre

0

Le problème est, que vous avez seulement très peu de nombres et un écart-type très élevé (moyenne: 2138, écart-type: environ 4400).

Vous pouvez ajuster l'amplitude, mais cela ne semble pas être une bonne solution ici. Je pense qu'il est préférable de travailler avec le médiane dans votre cas (voir ici comment implémenter la fonction: https://codereview.stackexchange.com/a/223). Tout simplement: la médiane est la valeur au milieu.

Ainsi, votre fonction pourrait ressembler à ceci:

function removeOutliers($arr, $alpha = 0.8, $beta = 1.2) { 
    $median = array_median($arr); 
    // assuming the array is sorted after median calculation 
    $bound = $median * $alpha; 
    $lower = 0; 
    while ($arr[$lower] < $bound) 
    $lower++; 
    $bound = $median * $beta; 
    $upper = count($arr) - 1; 
    while ($arr[$upper] > $bound) 
    $upper--; 
    return array_slice($arr, $lower, $upper - $lower + 1); 
}