2013-03-02 14 views
7

想我品尝选择返回下面的数字数据库中的记录:查找和PHP中去除离群

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

是否有可能在PHP有效地实施,以找到异常值的算法(如果有任何)根据他们偏离平均值多远来看浮标数组?

+7

异常值基于什么? – dynamic 2013-03-02 13:21:30

+0

也许与数学扩展:[http://www.php.net/manual/en/book.stats.php](http://www.php.net/manual/en/book.stats.php) – bitWorking 2013-03-02 13:26:54

+1

@ llnk基于给定结果中的数字。根据我的理解,异常值将基于内部和外部四分位数......但是,我再次承认,我在统计数学方面并不擅长。 – eComEvo 2013-03-02 13:29:28

回答

23

好让我们假设你在数组中有你的数据点,像这样:

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

然后你可以用下面的函数(见发生了什么评论)去除落在外的所有号码平均值的标准差次的+/-大小设置(默认为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); 
} 

?> 

对于示例这个函数返回的1级以下:

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

谢谢!工作得很好。算法很好,但在数学上非常糟糕。不知道这是怎么发生的! :) – eComEvo 2013-03-02 15:16:01

+0

@EcomEvolution NP ...'$ filter'部分是不必要的,我没有意识到我发布了它,所以你可以删除它。此外,我不是最好的数学,所以我用维基百科这个。 – 2013-03-02 19:28:44

+0

我需要一个函数来从数组中删除异常值,并且我遇到了您的答案。呃,为什么不把'$ magnitude = 1'设置在参数列表中,而不是先将它设置为'NULL',然后给它赋值1? :) – mavili 2013-08-16 15:24:33

1

对于正态分布的一组数据,删除超过均值3个标准差的值。

<?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

我喜欢这个,它可以工作,但我正在开发的客户端不想安装PECL扩展。不幸的是,这意味着无法使用统计库。感谢您的意见,并帮助我澄清我的目标! – eComEvo 2013-03-02 15:18:30

+0

我认为采取中位数值(以美元平均值计算)会更好。 – 2016-09-14 12:38:54