Есть ли встроенный numpy, чтобы делать что-то вроде следующего? То есть возьмите список d
и верните список filtered_d
с удаленными удаленными элементами на основе некоторого предполагаемого распределения точек в d
.
import numpy as np
def reject_outliers(data):
m = 2
u = np.mean(data)
s = np.std(data)
filtered = [e for e in data if (u - 2 * s < e < u + 2 * s)]
return filtered
>>> d = [2,4,5,1,6,5,40]
>>> filtered_d = reject_outliers(d)
>>> print filtered_d
[2,4,5,1,6,5]
Я говорю «что-то вроде», потому что функция может допускать различные распределения (пуассоновские, гауссовские и т. Д.) И различные пороговые значения выбросов внутри этих распределений (например, то, m
что я использовал здесь).
Ответы:
Этот метод почти идентичен вашему, только больше numpyst (также работает только с массивами numpy):
источник
m
он достаточно большой (например,m=6
), но для малых значенийm
он страдает из-за того, что среднее значение дисперсии не является надежными оценками.При работе с выбросами важно то, что нужно стараться использовать оценки как можно более надежные. Среднее значение распределения будет смещено из-за выбросов, но, например, медиана будет намного меньше.
Основываясь на ответе Эумиро:
Здесь я заменил среднее значение на более надежную медиану, а стандартное отклонение - на среднее абсолютное расстояние до медианы. Затем я масштабировал расстояния по их (снова) среднему значению, чтобы
m
получить разумный относительный масштаб.Обратите внимание, что для работы
data[s<m]
синтаксисаdata
должен быть массив numpy.источник
3.5 / .6745 ~= 5.189
(они умножаютs
на 0,6745 и указываютm
3,5 ... также берутabs(s)
). Кто-нибудь может объяснить выбор м? Или это то, что вы определите в своем конкретном наборе данных?m
а не пушистых заявлений, таких как «взаимодействие чистоты и эффективности»?TypeError: only integer scalar arrays can be converted to a scalar index
Ответ Бенджамина Банье дает сквозной эффект, когда медиана расстояний от медианы равна 0, поэтому я нашел эту модифицированную версию немного более полезной для случаев, приведенных в примере ниже.
Пример:
Дает:
источник
Основываясь на Бенджамине, используя
pandas.Series
и заменяя MAD на IQR :Например, если вы установите
iq_range=0.6
, процентили межквартильного диапазона станут:,0.20 <--> 0.80
поэтому будет включено больше выбросов.источник
Альтернативой является надежная оценка стандартного отклонения (при условии гауссовой статистики). Просматривая онлайн-калькуляторы, я вижу, что процентиль 90% соответствует 1,2815σ, а 95% - 1,645σ ( http://vassarstats.net/tabs.html?#z )
В качестве простого примера:
Результат, который я получаю:
Что близко к ожидаемому значению 2.
Если мы хотим удалить точки выше / ниже 5 стандартных отклонений (при 1000 баллах мы ожидаем, что 1 значение> 3 стандартных отклонений):
Который дает:
Я понятия не имею, какой подход более эффективен / надежен
источник
В этом ответе я хотел бы предоставить два метода: решение на основе «z-оценки» и решение на основе «IQR».
Код, представленный в этом ответе, работает как с одним тусклым
numpy
массивом, так и с несколькимиnumpy
массивами.Сначала импортируем несколько модулей.
метод на основе z-баллов
Этот метод проверяет, выходит ли число за пределы трех стандартных отклонений. На основе этого правила, если значение является выбросом, метод вернет true, если нет, вернет false.
Метод на основе IQR
Этот метод проверяет, является ли значение меньше
q1 - 1.5 * iqr
или большеq3 + 1.5 * iqr
, что аналогично методу построения графика в SPSS.Наконец, если вы хотите отфильтровать выбросы, используйте
numpy
селектор.Хорошего дня.
источник
Учтите, что все вышеперечисленные методы не работают, когда ваше стандартное отклонение становится очень большим из-за огромных выбросов.
( Сималар, поскольку вычисление среднего значения не выполняется, и его следует скорее вычислять медиану. Хотя среднее значение «более подвержено такой ошибке, как stdDv». )
Вы можете попытаться итеративно применить свой алгоритм или отфильтровать, используя межквартильный диапазон: (здесь «фактор» относится к диапазону * сигма, но только когда ваши данные соответствуют гауссовскому распределению)
источник
Я хотел сделать что-то подобное, за исключением установки числа на NaN, а не удаления его из данных, поскольку, если вы удалите его, вы измените длину, что может испортить построение (т.е. если вы удаляете только выбросы из одного столбца в таблице , но вам нужно, чтобы он оставался таким же, как и другие столбцы, чтобы вы могли построить их друг против друга).
Для этого я использовал функции маскировки numpy :
источник
если вы хотите получить позицию индекса выбросов
idx_list
, вернет его.источник
Для набора изображений (каждое изображение имеет 3 измерения), где я хотел отклонить выбросы для каждого использованного пикселя:
Тогда можно вычислить среднее значение:
(Я использую его для вычитания фона)
источник