2013-03-02 31 views
7

Giả sử tôi lấy mẫu một lựa chọn các hồ sơ cơ sở dữ liệu mà trả lại số điện thoại sau:Finding và sự chênh lệch loại bỏ trong PHP

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

Có một thuật toán có thể được thực hiện một cách hiệu quả trong PHP để tìm ra giá trị ngoại biên (nếu có bất kỳ) từ một mảng nổi dựa trên khoảng cách mà chúng lệch khỏi giá trị trung bình?

+7

Ngoại lệ dựa trên những gì? – dynamic

+0

có lẽ với phần mở rộng toán học: [http://www.php.net/manual/en/book.stats.php](http://www.php.net/manual/en/book.stats.php) – bitWorking

+1

@ llnk dựa trên các con số trong kết quả đã cho. Từ những gì tôi hiểu, các ngoại lệ sẽ dựa trên các phần tư bên trong và bên ngoài ... nhưng sau đó một lần nữa, tôi dễ dàng thừa nhận tôi không giỏi toán học thống kê. – eComEvo

Trả lời

23

Ok chúng ta hãy giả sử bạn có điểm dữ liệu của bạn trong một mảng như sau:

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

Sau đó, bạn có thể sử dụng chức năng sau đây (xem bình luận về những gì đang xảy ra) để loại bỏ tất cả các số đó nằm ngoài của giá trị trung bình +/- lần độ lệch chuẩn một cường độ bạn đặt (mặc định là 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); 
} 

?> 

Ví dụ bạn chức năng này trả về sau với cường độ 1:

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

Cảm ơn bạn! Hoạt động khá tốt. Tôi giỏi với thuật toán nhưng khủng khiếp về toán học. Không chắc làm thế nào điều đó xảy ra! :) – eComEvo

+0

@EcomEvolution NP ... phần '$ filter' là không cần thiết đã không nhận ra tôi đã đăng nó để bạn có thể xóa nó. Ngoài ra tôi không phải là giỏi nhất trong toán học vì vậy tôi đã sử dụng wikipedia cho việc này. –

+0

Tôi cần một hàm để loại bỏ các ngoại lệ khỏi một mảng và tôi đi qua câu trả lời của bạn. Erm, tại sao không chỉ đặt '$ magnitude = 1' trong danh sách đối số thay vì đặt nó thành' NULL' trước, và sau đó gán 1 cho nó sau đó? :) – mavili

1

Đối với tập hợp dữ liệu được phân phối bình thường, loại bỏ các giá trị lớn hơn 3 độ lệch chuẩn so với giá trị trung bình.

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

Tôi thích điều này và nó hoạt động, nhưng khách hàng của tôi đang phát triển cho không muốn phải cài đặt một phần mở rộng PECL. Thật không may điều đó có nghĩa là không thể sử dụng thư viện thống kê. Cảm ơn bạn đã nhập và giúp tôi làm rõ những gì tôi đã làm! – eComEvo

+0

Tôi nghĩ rằng sẽ là tốt mất giá trị trung bình (trong $ có nghĩa là). –

Các vấn đề liên quan