О простом методе быстрого обновления абсолютных центральных моментов
Привет, Хабр! Иногда сидишь, решаешь задачу, и, в процессе решения, чтобы продвинуться на следующий шаг, нужно придумать как сделать что-то очень простое — ну, то что наверняка уже делалось тысячи раз другими людьми. Кинувшись в поисковик перелопачиваешь какое-то количество литературы и вдруг понимаешь что либо ты просто искать не умеешь, либо это действительно никто до тебя не делал, или делал, но об этом не писал. В какой-то момент проще просто взять и решить задачу самому…
В этой заметке мы расскажем об одной такой задаче — простой, но которая нам понадобилась для кое-чего другого. Задача — придумать, как при увеличении наблюдаемой выборки быстро пересчитать ее абсолютный центральный момент.
Конкретная задача, которую мы решали, когда наткнулись на эту проблему — не очень существенна — мы пытались ускорить моделирование следующего комбинированного результата распознавания текстовой строки в видеопотоке, которое нам нужно для принятия решение об остановке (мы про это писали раньше на хабре). В процессе разработки метода (описанного, кстати, вот в этом докладе) мы наткнулись на задачу, которая один в один совпадала с задачей быстрого обновления абсолютного центрального момента первого порядка по некоторой выборке. И, к нашему удивлению, не смогли нагуглить, как это обычно делают. На самом деле делать это не трудно, и мы решили рассказать об этом здесь на Хабре, в более общем виде, на случай, если подобная проблема когда-то у кого-нибудь еще возникнет.
Итак, для начала нужно рассказать, что такое моменты выборок и какие они бывают. Для выборки можно определить два вида моментов -го порядка:
Для каждого из них так же существуют абсолютные версии:
Первый начальный момент — математическое ожидание по выборке (или просто среднее значение по выборке), а 2-й центральный момент также называется дисперсией выборки. Очевидно также, что абсолютные моменты четных порядков совпадают с соответствующими обычными моментами тех же порядков.
Задача быстрого обновления моментов выборки формулируется так: пусть наша выборка пополняется по одному элементу за один раз. На -м шаге процесса существует некоторая выборка размера , и этой выборке добавляется очередной элемент . После добавления в выборку нужно пересчитать текущее значение того или иного момента выборки как можно быстрее, используя какие-нибудь аккумуляторы.
Из четырех типов моментов три легко и быстро обновляются. Действительно, чтобы обновлять начальный или абсолютный начальный моменты порядка достаточно аккумулировать сумму -х степеней элементов выборки или их модулей, соответственно. Чтобы понять, как быстро обновлять центральный момент порядка , можно воспользоваться вот этой формулой, напрямую следующей из разложения формулы центрального момента с помощью бинома Ньютона:
Для быстрого обновления центрального момента, согласно этой формуле, нам достаточно уметь быстро обновлять первый начальный момент (что мы и так умеем), и аккумулировать суммы всех степеней элементов выборки до -й включительно.
Что же делать с абсолютным центральным моментом? Если порядок четный, то он совпадает с обычным центральным моментом, это понятно. А если порядок нечетный?…
Давайте мысленно разобьем нашу выборку на две части: и . Часть — это элементы выборки со значениями, меньшими среднего, а часть — элементы выборки со значениями, большими и равными среднему. Сумма модулей, возникающая в определении абсолютного центрального момента, может теперь быть раскрыта как две суммы без модулей — отдельно по части , для которой модули раскрываются «со знаком минус» и по части , для которой они раскрываются «со знаком плюс»:
Раскроем эту формулу с помощью бинома Ньютона:
И, аналогично формуле для обычного центрального момента, вынесем за скобки и за знаки суммы все, что можем:
Как теперь видно, чтобы быстро пересчитывать абсолютный центральный момент, нужно уметь быстро пересчитывать первый начальный (это мы умеем), и аккумулировать суммы всех степеней элементов выборки до -й включительно, но не по всей выборке, а отдельно по подмножествам и . Учитывая что мы и так умеем аккумулировать все степени всех элементов всей выборки , то достаточно только придумать, как аккумулировать суммы по подмножеству , а оставшееся вычислять простым вычитанием из общей суммы по выборке.
Аккумулировать суммы всех нужных нам степеней элементов множества легко, если хранить выборку в виде сбалансированного дерева поиска (к примеру, АВЛ-дерева, декартова дерева, или любого другого). Пусть каждому элементу выборки соответствует вершина дерева поиска, а также в вершине содержатся суммы всех нужных нам степеней всех элементов в поддереве с корнем в этой вершине. Тогда в таком дереве можно реализовать ответ на вопрос вида «какова сумма -х степеней всех элементов выборки , меньших заданного значения ?» (в качестве мы всегда будем использовать ). Действительно, чтобы ответить на такой вопрос, достаточно спуститься по дереву в поиске значения и каждый раз при переходе в правое поддерево добавлять к ответу -ю степень текущей вершины и ее левого поддерева. Трудоемкость операции — .
Трудоемкость добавления нового элемента в сбалансированное дерево будет составлять — логарифм на перестроение структуры, и мультипликатор , поскольку при каждой операции над деревом придется пересчитывать аккумуляторов в нескольких вершинах. За эту же трудоемкость мы можем получить значения всех аккумуляторов, которые используются в нашей формуле абсолютного центрального момента, а трудоемкость всех остальных операций для ее вычисления не превышает.
Таким образом, у нас получилось обновить -й абсолютный центральный момент выборки размера за время , хотя для этого нам пришлось содержать сбалансированное дерево с вершинами и с аккумулятором размера в каждой вершине.
Пару слов про то, зачем это нам вообще понадобилось. Ранее мы писали на хабре, что нас интересует задача поиска оптимального момента остановки — когда принимать решение о том, что захват кадров при распознавании в видеопотоке можно прекратить, и текущий результат принять как окончательный. Алгоритм, которым мы пользовались, состоял в моделировании возможного следующего наблюдения (т.е. следующего комбинированного результата распознавания) и в оценке расстояния от текущего результата до возможного следующего. Однако моделирование следующего результата, которое мы использовали, было достаточно накладным — оно нас устраивало теоретически, но практически требовало слишком много вычислений, да еще и это количество вычислений линейно зависело от количества уже просмотренных кадров. Мы придумали (и описали в этом докладе) более дешевый способ такого моделирования, и для обновления значения расстояния от текущего результата распознавания до моделируемого нам пришлось решать задачу, один в один совпадающую с задачей обновления 1-го абсолютного центрального момента. Решив ее так, как мы описали выше, с использованием декартовых деревьев в качестве поисковой структуры данных, мы получили способ принятия решения об остановке процесса распознавания, который вычисляет свое решение в десятки раз быстрее, чем то, что мы использовали до этого.
Надеемся, что вам было интересно, и если у вас есть идеи как более элегантно справиться с этой задачей (достигнув сопоставимую трудоемкость), то мы были бы рады обсудить их в комментариях. Алгоритм описан более подробно в этой публикации.