想我品嚐選擇返回下面的數字數據庫中的記錄:查找和PHP中去除離羣
20.50, 80.30, 70.95, 15.25, 99.97, 85.56, 69.77
是否有可能在PHP有效地實施,以找到異常值的算法(如果有任何)根據他們偏離平均值多遠來看浮標數組?
想我品嚐選擇返回下面的數字數據庫中的記錄:查找和PHP中去除離羣
20.50, 80.30, 70.95, 15.25, 99.97, 85.56, 69.77
是否有可能在PHP有效地實施,以找到異常值的算法(如果有任何)根據他們偏離平均值多遠來看浮標數組?
好讓我們假設你在數組中有你的數據點,像這樣:
<?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
)
謝謝!工作得很好。算法很好,但在數學上非常糟糕。不知道這是怎麼發生的! :) – eComEvo 2013-03-02 15:16:01
@EcomEvolution NP ...'$ filter'部分是不必要的,我沒有意識到我發佈了它,所以你可以刪除它。此外,我不是最好的數學,所以我用維基百科這個。 – 2013-03-02 19:28:44
我需要一個函數來從數組中刪除異常值,並且我遇到了您的答案。呃,爲什麼不把'$ magnitude = 1'設置在參數列表中,而不是先將它設置爲'NULL',然後給它賦值1? :) – mavili 2013-08-16 15:24:33
對於正態分佈的一組數據,刪除超過均值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;
}
我喜歡這個,它可以工作,但我正在開發的客戶端不想安裝PECL擴展。不幸的是,這意味着無法使用統計庫。感謝您的意見,並幫助我澄清我的目標! – eComEvo 2013-03-02 15:18:30
我認爲採取中位數值(以美元平均值計算)會更好。 – 2016-09-14 12:38:54
異常值基於什麼? – dynamic 2013-03-02 13:21:30
也許與數學擴展:[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
@ llnk基於給定結果中的數字。根據我的理解,異常值將基於內部和外部四分位數......但是,我再次承認,我在統計數學方面並不擅長。 – eComEvo 2013-03-02 13:29:28