Как эффективно оценить медиану экспоненциально распределенной величины?
Есть временной ряд, в который собираются времена отклика сервера. Времена примерно распределены экспоненциально (если точнее - то ближе к гамма-распределению). 95% значений плавают вокруг некой постоянной величины Х, а остальные 5% значений могут превышать значение Х в несколько тысяч раз. Задача - при получении каждого нового значения ряда пересчитывать оценку Х. Простая оценка Х как среднее значение ряда является несостоятельной. Как за минимальное количество математических действий оценить значение Х? На ум приходит только построение гистограммы, но может есть какие-то более легкие/быстрые способы? Реализовывать придется на С++, поэтому нет возможности использовать продвинутые математические тулзы.
Построение гистограммы - это довольно легко, только вот информативность там не самая лучшая. Особенно в вашем случае.
Вы поясните, что вы вкладываете в значение оценить. Т.е. о чем должна говорить оценка. Если вам критично количество долгих запросов - то можно как оценку взять количество запросов отклоняющихся от математического ожидания на какую-нибудь величину(см. неравенство Чебышева). Если вас что-то другое интересует - то укажите, будем думать
Сверхзадача такова:
Софтина отправляет запрос на сервер и ждет ответа. Если ответа нет {Х + сколько-то} мкс, то софтина должна что-то сделать, например, запросить резервный сервер, записать warning в лог, оповестить кого-нибудь, etc...
> Простая оценка Х как среднее значение ряда является несостоятельной.
Почему нельзя выбрасывать выпады при вычислении среднего которые в № раз больше/меньше чем текущее среднее ?
Рекурентную формулу для вычисления среднего арифметического на окне из № отсчетов думаю найти можно, или вывести в тетрадке.
Выпады можно фильтровать, но вот незадача - они случайны. И первое значение может оказаться выпадом, после которого ни одно нормальное значение не попадет в выборку. Фильтр можно использовать, если накопить сколько-то значений (опять же вопрос - сколько?), отсортировать их, выкинуть 5% самых больших, а по остатку взять среднее, и на основании этого среднего фильтровать дальше, но не то, чтобы это было красивым и простым в реализации решением.
Простейшую рекуррентную формулу можно взять у форекса - экспоненциально сглаженная скользящая средняя, она же EMA: X(t) = X(t-1) + a * (value(t) - X(t-1)), где a = 2 / (N + 1)
Но у нее тот же недостаток: что если первое значение будет выпадом???
> Но у нее тот же недостаток: что если первое значение будет выпадом???
а что уже нельзя вычислить в начале работы среднее арифметическое по № первым отсчетам по обычной школьной формуле?
Можно, но
1) если среднее арифметическое по N отсчетам содержит хотя бы 1 выпад, то его значение будет несостоятельной оценкой
2) как выбрать N? пальцем в небо? так себе модель.
3) что делать до того, как наберется N значений?