Представьте, что у меня есть набор измерений x, которые принимаются многими процессами x 0... x N в разы t 0... t N. Предположим, что в момент времени t я хочу сделать оценку текущего значения x, исходя из предположения о том, что не существует долговременного тренда, о котором я знаю, и что x можно предсказать из алгоритма, такого как экспоненциальное сглаживание. Поскольку у нас много процессов, и N может стать очень большим, я не могу хранить больше нескольких значений (например, предыдущего состояния).
Один из подходов здесь - адаптировать нормальный алгоритм экспоненциального сглаживания. Если образцы берутся регулярно, я бы сохранил оценку y n, чтобы:
y n= & alpha;. y n-1 + ( 1 - & alpha;). <Я > х <суб > псуб >
Этот подход невелик, когда выборка нерегулярна, так как многие образцы вместе будут иметь непропорциональное влияние. Поэтому эта формула может быть адаптирована к:
y n= & alpha; n. y n-1 + (1 - & alpha; n). <Я > х <суб > псуб >
где
& alpha; n= e -k. (t n - t n-1суб > )
IE динамически корректирует константу сглаживания в зависимости от интервала между двумя предыдущими образцами. Я доволен этим подходом и, похоже, работает. Это первый ответ, приведенный здесь, и хорошее резюме этих методов дано Экнером в этой статье в 2012 году (PDF).
Теперь, мой вопрос заключается в следующем. Я хочу адаптировать приведенное выше, чтобы оценить скорость возникновения. Иногда случается событие. Используя аналогичную методику экспоненты, я хочу получить оценку скорости, в которой происходит событие.
Две очевидные стратегии:
- Чтобы использовать первый или второй метод, используя задержку между двумя последними событиями как ряд данных x n.
- Чтобы использовать первый или второй метод, используя обратную задержку между двумя последними событиями (например, скоростью) в качестве серии данных x n.
Ни один из них не оказался хорошим, насколько я могу судить. Во-первых, принять событие, которое происходит каждые 500 мс (с одной стороны) и событие, которое происходит с задержкой в 200 мс и с задержкой в 800 мс с другой. Очевидно, что оба они происходят два раза в секунду, поэтому приведенная оценка скорости должна быть одинаковой. Игнорирование времени из последнего образца кажется безрассудным, поэтому я сосредоточусь на второй стратегии. Использование задержки (а не обратной) не оказывается хорошим предиктором, потому что имитация потока проб 200 мс /800 мс дает оценку около 1,5 (на основе среднего числа обратных не является обратным среднему).
Но гораздо важнее то, что ни одна стратегия не справляется с тем, что на самом деле происходит на практике, а это значит, что внезапно все события прекращаются надолго. Таким образом, "последним" значением y является значение на последнем событии, и поэтому оценка скорости никогда не рассчитывается. Следовательно, скорость становится постоянной. Конечно, если бы я анализировал данные ретроспективно, это не было бы проблемой, но я анализирую ее в реальном времени.
Я понимаю, что другой способ сделать это - периодически запускать поток (например, каждые 10 секунд) и подсчитывать количество вхождений в этот 10-секундный интервал. Это очень ресурс, тяжелый мой конец, так как статистика не нужна часто, и мне не нравится запускать поток, который проверяет все из-за проблем с мьютексом. Поэтому я хотел бы (каким-то образом) использовать алгоритм, который регулирует состояние, считанное (например), время с момента последнего образца. Это кажется разумным подходом, как если бы производительность измерялась по времени, выбранному независимо от образцов, время измерения в среднем составляло бы половину пути между периодами между образцами, поэтому очень грубая неопределенная оценка скорости была бы половиной обратной величины время с момента последнего образца. Чтобы усложнить ситуацию, мое время измерения не будет зависеть от образцов.
У меня такое чувство, что у этого есть простой ответ, но он ускользает от меня. У меня есть ощущение, что правильный маршрут состоит в том, чтобы предположить, что события распределены по Пуассону, и получить оценку для & lambda;на основе интервала с последнего образца и некоторой формы скользящей средней, но моя статистика слишком ржавая, чтобы сделать эту работу.
В этом вопросе есть примерно такой обход , но ответ кажется не очень удовлетворительным (надеюсь, я объяснил, почему). Я бы добавил, что фильтр Калмана кажется способным к тяжеловесу, учитывая, что у меня есть одна переменная, чтобы оценить и ничего не знать об этом. Существует множество других близких друг к другу случаев, большинство из которых либо предполагают сохранение больших значений значений (не реалистично здесь с точки зрения памяти), либо не затрагивают две проблемы выше.