Я использовал это Stackoverflow ответ удалить выбросы из набора данных до величины 1.
Это прекрасно работает для удаления больших чисел, но не удаляет нижние выбросы.
Например, из следующего набора данных: (0, 1, 344, 345, 10000)
это будет держать 0, 1
когда я хотел бы их удалить.
Как я могу отредактировать код из приведенного выше связанного ответа, чтобы удалить и нижние выбросы?
Проблема в том, что у вас очень мало номеров и очень высокое стандартное отклонение (среднее значение: 2138, стандартное отклонение: около 4400).
Вы можете настроить величину, но это не кажется хорошим решением здесь. Я думаю, что лучше всего работать с медиана в вашем случае (смотрите здесь, как реализовать функцию: https://codereview.stackexchange.com/a/223). Проще говоря: медиана — это значение в середине.
Итак, ваша функция может выглядеть так:
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);
}
Других решений пока нет …