2013-03-02 13 views
7

Supponiamo che io assaggiare una selezione di record del database che restituiscono i seguenti numeri:ricerca e la rimozione valori anomali in PHP

20.50, 80.30, 70.95, 15.25, 99.97, 85.56, 69.77 

Esiste un algoritmo che può essere implementato in modo efficiente in PHP per trovare i valori anomali (se ce ne sono) da una serie di fluttuanti in base a quanto si allontanano dalla media?

+7

Valore anomalo in base a cosa? – dynamic

+0

forse con estensione matematica: [http://www.php.net/manual/en/book.stats.php](http://www.php.net/manual/en/book.stats.php) – bitWorking

+1

@ llnk basato sui numeri nel risultato dato. Da quello che ho capito, i valori anomali si baserebbero sui quartili interno ed esterno ... ma poi di nuovo ammetto che non sono bravo in matematica statistica. – eComEvo

risposta

23

Ok supponiamo che avete i vostri punti di dati in un array in questo modo:

<?php $dataset = array(20.50, 80.30, 70.95, 15.25, 99.97, 85.56, 69.77); ?> 

Quindi è possibile utilizzare la seguente funzione (vedi commenti per ciò che sta accadendo) per rimuovere tutti i numeri che non rientrano della media +/- tempi deviazione standard di magnitudo si imposta (default 1):

<?php 

function remove_outliers($dataset, $magnitude = 1) { 

    $count = count($dataset); 
    $mean = array_sum($dataset)/$count; // Calculate the mean 
    $deviation = sqrt(array_sum(array_map("sd_square", $dataset, array_fill(0, $count, $mean)))/$count) * $magnitude; // Calculate standard deviation and times by magnitude 

    return array_filter($dataset, function($x) use ($mean, $deviation) { return ($x <= $mean + $deviation && $x >= $mean - $deviation); }); // Return filtered array of values that lie within $mean +- $deviation. 
} 

function sd_square($x, $mean) { 
    return pow($x - $mean, 2); 
} 

?> 

per esempio, questa funzione restituisce il seguente con una magnitudo di 1:

Array 
(
    [1] => 80.3 
    [2] => 70.95 
    [5] => 85.56 
    [6] => 69.77 
) 
+0

Grazie! Funziona abbastanza bene. Sono bravo con gli algoritmi ma stranamente terribile in matematica. Non sei sicuro di come sia successo! :) – eComEvo

+0

@EcomEvolution NP ... la parte '$ filter' non era necessaria non si rendeva conto che l'ho pubblicata in modo da poterla rimuovere. Inoltre non sono il migliore in matematica quindi ho usato wikipedia per questo. –

+0

Ho bisogno di una funzione per rimuovere i valori anomali da un array e trovo la tua risposta. Ehm, perché non impostare '$ magnitude = 1' nella lista degli argomenti invece di impostarlo prima su' NULL' e quindi assegnargli 1 in seguito? :) – mavili

1

Per un set di dati normalmente distribuito, rimuove valori superiori a 3 deviazioni standard dalla media.

<?php 
function remove_outliers($array) { 
    if(count($array) == 0) { 
     return $array; 
    } 
    $ret = array(); 
    $mean = array_sum($array)/count($array); 
    $stddev = stats_standard_deviation($array); 
    $outlier = 3 * $stddev; 
    foreach($array as $a) { 
     if(!abs($a - $mean) > $outlier) { 
      $ret[] = $a; 
     } 
    } 
    return $ret; 
} 
+0

Mi piace e funziona, ma il client che sto sviluppando non desidera installare un'estensione PECL. Sfortunatamente ciò significava che non si poteva usare la libreria delle statistiche. Grazie per il tuo contributo e aiutandomi a chiarire cosa stavo andando a fare! – eComEvo

+0

Penso che sarebbe buono assumere valore mediano (in media $). –

Problemi correlati