LINUX.ORG.RU

Задачка по мат. статистике

 


0

2

Предположим есть группа чисел за определенный промежуток времени. В ней есть кратковременные по времени аномалии: аномально большие числа и аномально малые. Нужно вычленить эти числа из искомой группы чисел. Какие для этого есть алгоритмы ? Пока в голову приходит: отсортировать числа по возрастанию и убрать например 5% самых малых и самых больших чисел ( но как определить этот процент ). Есть ли готовые алгоритмы для этого ?

★★☆☆

Последнее исправление: SI (всего исправлений: 1)

раз абстрактная группа, то предположим что они подчиняются нормальному распределению и выбросим все что больше 3-х сигм. http://ru.wikipedia.org/wiki/%D0%A1%D1%80%D0%B5%D0%B4%D0%BD%D0%B5%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%BE%D1%82%D0%BA%D0%BB%D0%BE%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5. «Правило трёх сигм».

anonymous
()

Такие значения называются «грубые выбросы», ну или просто «статистические выбросы», по-буржуйски – «Outlier». В общем-то, подойдет любой метод:

  • Отбрасывание точек за пределами 5% и 95% от максимального значения. Подсчитываем 5% и 95% квантили и вырезаем лишнее.
  • Выкидывание значений за пределами 5 СКО (то, что порекомендовал первый комментатор). Если распределение нормальное, то шансов встретить что-то настоящее за этими пределами практически нет.
  • Совсем по-научному. Использовать статистический критерий. Скажем, критерий Пирса: считаем максимальное отклонение от среднего, делим на СКО, сравниваем это число с таблицей. Если все путем – выбросов нет, берем на борт все точки. Если в Хьюстоне есть проблемы – выкидываем то самое значение, из-за которого получилась вся эта ерунда, и повторяем расчет, и так до тех пор, пока не будет все в ажуре. Вот статейка (англ.) с описанием, примером и самой таблицей в самом конце: http://classes.engineering.wustl.edu/2009/fall/che473/handouts/OutlierRejecti...
anonymous
()

Тебе нужно анализировать в реальном времени? То есть в некотором временном окне. Или данные статичные?

imul ★★★★★
()
Ответ на: комментарий от SI

В таком случае анализ делаешь на множестве, которое попадает в какое-то временное окно на потоке данных. Насколько его делать широким и как его сдвигать в потоке данных это уже зависит от характера самих данных и неоходимой точности. Можно каждый раз обсчитывать статистику независимо, можно использовать статистику от предыдущего содержимого окна. В любом случае результат будет плавать и то, что не попадает в выборку в предыдущем окне, может попасть в выборку в текущем. Это зависит от самих данных. Хотя, такой эффект менее заметен в случае накопления статистики.
Многопроходность в случае реального времени можно и не успеть (хотя конечно смотря сколько данных в единицу времени), а вот отбрасывание за один проход в текущем окне можно реализовать в случае использования статистики, накопленной для предыдущего окна. И отбрасывание и накопление статистики, всё за один проход. Единственный минус — самые первые данные всё-равно придётся обсчитывать многопроходно для накопления рабочей статистики (например среднего и сигмы).
Если нужно хранить данные, то поток получается линейным. Если хранить данные не надо, а просто показывать какой-то мгновенный график, то можно завернуть поток в кольцевой буфер.

imul ★★★★★
()
Ответ на: комментарий от anykey_mlya

Эту тему можно конечно в толксы отправить, но там анонимный постинг запрещён, а самые оперативные и полезные комментарии в этой теме всё-таки оставлены анонимус{ом,ами}.

imul ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.