Коллеги, появилась достаточно простая задача, в которой правда я не совсем уверен в правильности своих суждений.
И так предположим на вход программе подается бесконечный поток чисел с плавающей точкой, каждое из которых отличается от предыдущего в определенных рамках.
Рамки строго не определены и в каждом случае будут разные. Где-то числа будут отличаться на единицу — две, где-то на 0.0001, где-то на сотни.
Целью программы является нахождение некоего нормального отклонения для этих чисел и отклонения которое превышает нормальное. В случае превышения, уведомлять об этом.
Уверен что мне просто не хватает знания мат статистики для применения какой-нибудь простой формулы для нахождения этого самого нормального отклонения для каждого потока.
Спасибо за внимание к вопросу
P.S. Если где-то использовал термин не правильно, простите, реально забыл все что было в курсе мат статистики)))
Это нужно смотреть по характеру данных. Среднее арифметическое не дает представления о распределении данных. Если у вас [11, 11, 13, 4, 2, 12], то среднее будет 8.833. Гораздо более удобная метрика, по моему, медиана, 11. А тут как раз приходит стандартное отклонение, позволяющее отбрасывать сомнительные данные.
Еще учтите, что для расчета стандартного отклонения вам надо использовать формулу для неполного набора данных (sample standard deviation, не знаю, как будет на русском). То же самое и для медианы, но тут я не уверен.
Попробуйте использовать MAD (Median absolute deviation).
Так же можно использовать абсолютное отклонение, как тут уже рекомендовали. И ещё обратите внимание на правило трёх сигм если у вас нормально распределённая случайная величина.
Но мне кажется, в вашем случае хорошо подойдёт MAD и ± 3 сигмы для отбрасывания выколов, ведь по сути, как я понял, вам нужно отфильтровать импульсные шумы.
Ну, это в принципе то же самое. Тогда вы будете искать всё, что выходит за границы ± n сигм от среднего уровня (например, медианы). А там уже можно и гистограмму составить и по ней выбрать наиболее встречаемые уровни.
Была подобная задача с поиском средней цены по рынку, с отбрасыванием как вы их называете «шпилек».
Пошел по простому пути: искал отклонение в процентном отношение от среднего значения,
причем среднее значение получал так: сортировал цены по возрастанию, отбрасывал 10% самых дешевых и 10% самых дорогих… и уже среди оставшихся 80% получал обычное среднее арифметическое.
экстремумы отбрасывал, тк много «мусорных» и ошибочных данных… например интернет магазин не имеет данный товар в наличие, но цена установлена еще 2 года назад и до сих пор указана и уже не актуальна. Или например температуру с arduino собираем… иногда «пролетают» ошибочные показания…
поэтому если не до конца доверяете «входящим» данным то, такая 80% выборка будет давать более корректное число.
а конкретно для вас: вы можете постоянно получать среднее арифметическое 80% из 100 последних чисел, и уже сравнивать «пики» с этим числом.
хорошо:
— находим среднее арифметическое от 80% (что бы оно получилось без учета пиков) из 100 последних цифр
— если текущее значение больше или меньше чем среднее арифметическое в n-раз тогда число найдено — выводим
А в пределах «бесконечного» потока чисел характеристики данных (величины отклонения) могут меняться? Или на один «запуск» подаются данные только из одного случая?
скажем просто потоков много, внутри каждого потока поведение практически не меняется. То есть его надо высчитывать предположим на основе каждых 1000 значений, например.
Если входной поток бесконечен, то нужно считать среднеквадратическое отклонение (сигму) по окну (по последним N значениям). Далее отбрасываем те значения, которые отклоняются от среднего по окну более чем на три сигмы, например.