23
правки
Изменения
исправил замечания куратора
}}
===Оценка вероятности===
''Контекстная модель'' строятся на основании ''обычных счетчиков частот'', связанных с текущим контекстом. Если мы обработали строку <tex>“кускувукус”</tex>, то для контекста <tex>“ку”</tex> счетчик символа «<tex>c</tex> » равен ''двум'', символ «<tex>в</tex> » — ''единице''. На основании этого статистики можно утверждать, что вероятность появления «<tex>c</tex> » после <tex>“ку”</tex> равна <tex> \dfrac{2}{3}</tex> , а вероятность появления «<tex>в</tex> » равна <tex> \dfrac{1}{3}</tex>, т.е. Оценки формируются на основе уже просмотренной части потока.
{{Определение
|definition=
Рассмотрим процесс оценки отмеченного на рисунке стрелочкой символа <tex>л</tex>, встречающегося в блоке <tex>“молочное</tex>'''''_'''''<tex>молоко”</tex>
[[Файл: milk.png|350px|thumb|right|рис. 1]]
Будем использовать <tex>КМ(2)</tex> с полным смешиванием и использованием заданного набора фиксированных весов <tex>КМ</tex> разных порядков: <tex>\omega(2) = 0.6</tex>, <tex>\omega(1) = 0.3</tex> и <tex>\omega(0) = 0.1</tex>. Считаем, что в начале кодирования в <tex>КМ(o)</tex> создаются счетчики для всех символов алфавита <tex>\{“м”, “о”, “л”, “ч”, “н”, “е”,“\_”, “к”\}</tex> и инициализируются ''единицей''; счетчик символа после его обработки увеличивается на единицу. Для текущего символа «<tex>л</tex> » имеются контексты <tex>“мо”</tex>, <tex>“о”</tex> и <tex>“”</tex> (0-го порядка). К данному моменту для них накоплена статистика, показанная в ''таблице''
{| style="background-color:#CCC;margin:0.5px"
!style="background-color:#EEE"| Порядок
!style="background-color:#EEE"|
!style="background-color:#EEE"| <tex>“м”«м»</tex>!style="background-color:#EEE"| <tex>“о”«о»</tex>!style="background-color:#EEE"| <tex>“л”«л»</tex>!style="background-color:#EEE"| <tex>“ч”«ч»</tex>!style="background-color:#EEE"| <tex>“н”«н»</tex>!style="background-color:#EEE"| <tex>“е”«е»</tex>!style="background-color:#EEE"| <tex>“«</tex>'''''_'''''<tex>”»</tex>!style="background-color:#EEE"| <tex>“к”«к»</tex>
|-
|style="background-color:#FFF;padding:2px 30px"| <tex>КМ(0)</tex>
|style="background-color:#FFF;padding:2px 30px"| <tex> — </tex>
|}
Оценка вероятности для символа «<tex>л</tex> » будет равна <tex> p(л) = 0.1\cdot\dfrac{2}{19}+0.3\cdot\dfrac{1}{3}+0.6\cdot\dfrac{1}{1} = 0.71 </tex>
====Метод неявного взвешивания====
''Метод неявного взвешивания'' связан с введением вспомогательного '''''символа ухода''''' (''escape''). ''Символ ухода'' не принадлежит к алфавиту сжимаемой последовательности. Фактически он используется для передачи ''декодеру'' указаний ''кодера''. Идея заключается в том, что если используемая <tex>КМ</tex> не позволяет оценить текущий символ (его счетчик равен нулю в этой <tex>КМ</tex>), то на выход посылается закодированный ''символ ухода'' и производится попытка ''оценить'' текущий символ в другой <tex>КМ</tex>, которой соответствует контекст иной длины. Обычно попытка оценки начинается с <tex>КМ</tex> наибольшего порядка <tex>N</tex>, затем в определенной последовательности осуществляется переход к контекстным моделям меньших порядков.
==Метод PPMРРМ==
===Описание===
{{Определение
'''''Адаптивное моделирование''''' (''adaptive context modeling'') — метод моделирования, при котором, по мере кодирования модель изменяется по заданному алгоритму.
}}
{{Определение |definition='''''Энтропийное кодирование''''' (''entropy coding'') — кодирование ''последовательности значений'' с возможностью ''однозначного'' восстановления с целью ''уменьшения'' объёма данных с помощью ''усреднения'' вероятностей появления элементов в ''закодированной'' последовательности.}}<tex>РРМPPM </tex> (''Prediction by partial matchingPartial Matching'') относится к — адаптивный алгоритм сжатия данных без потерь, основанный на контекстном моделировании и предсказании. Модель <tex> PPM </tex> использует ''адаптивнымконтекст'' методам моделирования. Исходно кодеру и декодеру поставлена — множество символов в соответствие несжатом потоке, предшествующих данному, чтобы ''начальнаяпредсказывать'' модель источника значение символа на основе статистических данных. Будем считать, что она состоит из Сама модель <tex>КМ(-1)PPM </tex>, присваивающей одинаковую вероятность всем символам алфавита входной последовательности. После обработки текущего символа кодер и декодер изменяют свои модели одинаковым образом, в частности лишь ''наращиваяпредсказывает значение символа'' величину оценки вероятности рассматриваемого символа. Следующий символ кодируется (декодируется) на основании новой, измененной моделинепосредственное сжатие осуществляется алгоритмами энтропийного кодирования, как например, после чего модель снова модифицируется и т. д. На каждом шаге обеспечивается ''идентичность'' модели кодера и декодера за счет применения одинакового механизма ее обновленияалгоритм Хаффмана или арифметическое кодирование.
Если символ «<tex>s</tex> » обрабатывается при помощи <tex>РРМ</tex>, то, в первую очередь рассматривается <tex>KM(N)</tex>. Если она оценивает вероятность «<tex>s</tex> » числом, не равным нулю, то сама и используется для кодирования «<tex>s</tex>». Иначе выдается сигнал в виде символа ухода, и на основе меньшей по порядку <tex>KM(N-1)</tex> производится очередная попытка оценить вероятность «<tex>s</tex>». Кодирование происходит через уход к <tex>КМ</tex> меньших порядков до тех пор, пока «<tex>s</tex> » не будет оценен. <tex>КМ(-1)</tex> гарантирует, что это в конце концов произойдет. Таким образом, каждый символ кодируется серией кодов символа ухода, за которой следует код самого символа. Из этого следует, что вероятность ухода также можно рассматривать как вероятность перехода к контекстной модели меньшего порядка.
===Пример===
====Кодирование====
!style="background-color:#EEE"| <tex>Бит</tex>
|-
|style="background-color:#FFF;padding:2px 20px"| «<tex>a</tex>»
|style="background-color:#FFF;padding:2px 20px"| <tex> — </tex>
|style="background-color:#FFF;padding:2px 20px"| <tex>\dfrac{1}{2+1}</tex>
|style="background-color:#FFF;padding:2px 20px"| <tex>1.6</tex>
|-
|style="background-color:#FFF;padding:2px 20px"| «<tex>б</tex>»
|style="background-color:#FFF;padding:2px 20px"| <tex> — </tex>
|style="background-color:#FFF;padding:2px 20px"| <tex>\dfrac{1}{2+1}</tex>
|style="background-color:#FFF;padding:2px 20px"| <tex>2.6</tex>
|-
|style="background-color:#FFF;padding:2px 20px"| «<tex>в</tex>»
|style="background-color:#FFF;padding:2px 20px"| <tex> — </tex>
|style="background-color:#FFF;padding:2px 20px"| <tex>\dfrac{1}{2+1}</tex>
|style="background-color:#FFF;padding:2px 20px"| <tex>1.6</tex>
|-
|style="background-color:#FFF;padding:2px 20px"| «<tex>г</tex>»
|style="background-color:#FFF;padding:2px 20px"| <tex> — </tex>
|style="background-color:#FFF;padding:2px 20px"| <tex>\dfrac{1}{2+1}</tex>
|style="background-color:#FFF;padding:2px 20px"| <tex>2.6</tex>
|}
Пусть текущий символ равен «<tex>г</tex>», т. е. «<tex>?</tex> » = «<tex>г</tex>», тогда процесс его кодирования будет выглядеть следующим образом.Сначала рассматривается контекст <tex>3</tex>-го порядка <tex>“ббв”</tex>. Ранее он не встречался, поэтому кодер, ничего не послав на выход, переходит к анализу статистики для контекста <tex>2</tex>-го порядка. В этом контексте (<tex>“бв”</tex>) встречались символ «<tex>а</tex> » и символ «<tex>в</tex>», счетчики которых в соответствующей <tex>КМ</tex> равны <tex>1</tex> каждый, поэтому ''символ ухода'' кодируется с вероятностью <tex>\dfrac{1}{2+1}</tex>, где в знаменателе число <tex>2</tex> — наблюдавшаяся частота появления контекста <tex>“бв”</tex>, <tex>1</tex> — значение счетчика ''символа ухода''. В контексте <tex>1</tex>-го порядка «<tex>в</tex> » дважды встречался символ «<tex>а</tex>», который исключается (маскируется), один раз также исключаемый «<tex>в</tex> » и один раз «<tex>б</tex>», поэтому оценка вероятности ухода будет ''равна'' <tex>\dfrac{1}{1+1}</tex>. В <tex>КМ(0)</tex> символ «<tex>г</tex> » также оценить ''нельзя'', причем все имеющиеся в этой <tex>КМ</tex> символы «<tex>а</tex>», «<tex>б</tex>», «<tex>в</tex> » исключаются, так как уже встречались нам в <tex>КМ</tex> более высокого порядка. Поэтому вероятность ухода получается равной ''единице''. Цикл оценивания завершается на уровне <tex>КМ(-1)</tex>, где «<tex>г</tex> » к этому времени остается ''единственным'' до сих пор не попавшимся символом, поэтому он получает вероятность <tex>1</tex> и кодируется посредством <tex>0\ бит</tex>бит. Таким образом, при использовании хорошего статистического кодировщика для представления «<tex>г</tex> » потребуется в целом примерно <tex>2.6\ бит</tex>бит. Перед обработкой следующего символа создается <tex>КМ</tex> для строки <tex>“ббв”</tex> и производится модификация счетчиков символа «<tex>г</tex> » в созданной и во всех просмотренных <tex>КМ</tex>. В данном случае требуется изменение <tex>КМ</tex> всех порядков от <tex>0</tex> до <tex>N</tex>.
====Декодирование====
Алгоритм декодирования ''абсолютно'' симметричен алгоритму кодирования. После декодирования символа в текущей <tex>КМ</tex> проверяется, не является ли он ''символом ухода''; если это так, то выполняется переход к <tex>КМ</tex> порядком ниже. Иначе считается, что исходный символ ''восстановлен'', он ''записывается'' в декодированный поток и осуществляется переход к следующему шагу. Содержание процедур обновления счетчиков, создания новых ''контекстных моделей'', прочих вспомогательных действий и последовательность их применения должны быть строго одинаковыми при кодировании и декодировании. Иначе возможна рассинхронизация копий модели кодера и декодера, что рано или поздно приведет к ошибочному декодированию какого-то символа. Начиная с этой позиции вся оставшаяся часть сжатой последовательности будет разжата неправильно.
!style="background-color:#EEE"| <tex>Кодовое\ пространство</tex>
|-
|style="background-color:#FFF;padding:2px 30px"| «<tex>а</tex>»
|style="background-color:#FFF;padding:2px 30px"| <tex> 0 </tex>
|style="background-color:#FFF;padding:2px 90px"| <tex> — </tex>
|style="background-color:#FFF;padding:2px 60px"| <tex> — </tex>
|-
|style="background-color:#FFF;padding:2px 30px"| «<tex>б</tex>»
|style="background-color:#FFF;padding:2px 30px"| <tex> 1 </tex>
|style="background-color:#FFF;padding:2px 90px"| <tex>\dfrac{1}{3}</tex>
|style="background-color:#FFF;padding:2px 60px"| <tex> [0\ldots0.33) </tex>
|-
|style="background-color:#FFF;padding:2px 30px"| «<tex>в</tex>»
|style="background-color:#FFF;padding:2px 30px"| <tex> 1 </tex>
|style="background-color:#FFF;padding:2px 90px"| <tex>\dfrac{1}{3}</tex>
|style="background-color:#FFF;padding:2px 60px"| <tex> [0.33\ldots0.66) </tex>
|-
|style="background-color:#FFF;padding:2px 30px"| «<tex>г</tex>»
|style="background-color:#FFF;padding:2px 30px"| <tex> 0 </tex>
|style="background-color:#FFF;padding:2px 90px"| <tex> — </tex>
|style="background-color:#FFF;padding:2px 60px"| <tex> — </tex>
|-
|style="background-color:#FFF;padding:2px 23px"| «<tex>esc</tex>»
|style="background-color:#FFF;padding:2px 30px"| <tex> 1 </tex>
|style="background-color:#FFF;padding:2px 90px"| <tex>\dfrac{1}{3}</tex>
|style="background-color:#FFF;padding:2px 90px95px"| <tex>1</tex>
|style="background-color:#FFF;padding:2px 60px"| <tex> [0.66\ldots1) </tex>
|}
Хороший кодировщик должен отобразить символ «<tex>s</tex> » с оценкой вероятности <tex>p(s)</tex> в код длины <tex>\log_2 p(s)</tex>, что и обеспечит сжатие всей обрабатываемой последовательности в целом.
==Проблема нулевой частоты==
{{Определение
*<tex>Q_i</tex> — количество таких разных символов, что они встречались в контексте ровно <tex>i</tex> раз
*<tex>Esc_x</tex> — <tex>ОВУ</tex>(''оценка вероятности кода ухода'') по методу <tex>x</tex>
Изобретатели алгоритма PPM <tex>РРМ</tex> предложили два метода <tex>ОВУ</tex>: так называемые метод <tex>A </tex> и метод <tex>B</tex>. Частные случаи алгоритма PPM <tex>РРМ</tex> с использованием этих методов называются, соответственно, <tex> PPMA </tex> и <tex> PPMB</tex>.
<tex>PPMA:\ Esc_A = \dfrac{1}{С + 1}</tex>
<tex>PPMB:\ Esc_B = \dfrac{Q - Q_1}{С}</tex>
Затем был разработан метод <tex>С</tex>, а в след за ним метод <tex>D</tex>:
<tex>PPMC:\ Esc_C = \dfrac{Q}{С + Q}</tex>
}}
Для нахождения <tex>ОВУ</tex> строятся <tex>контексты\ ухода</tex> (''Escape Context''), формируемые из различный полей. Всего используется <tex>4</tex> поля, в которых содержится информация о:
*порядке PPM<tex>РРМ-</tex>контекста
*количестве уходов
*количестве успешных кодирований
*последних двух символах PPM<tex>РРМ-</tex>контекста <tex>ОВУ</tex> для текущего контекста находится путем взвешивания оценок, которые дают три контекста ухода (<tex>order-2\ EC</tex>, <tex>order-1\ EC</tex>, <tex>order-0\ EC</tex>), соответствующие текущему <tex>РРМ-</tex>контексту. <tex>Order-2\ EC</tex> наиболее точно соответствует ''текущему'' контексту, контексты ''ухода'' порядком ниже формируются путем выбрасывания части информации полей <tex>order-2\ EC</tex>. При взвешивании контекстов ухода используются следующие веса <tex>w</tex>: <tex>\dfrac{1}{w} = p \cdot log_2 \dfrac{1}{p} + (1 - p) \cdot log_2 \dfrac{1}{1 - p}</tex>, где <tex>p - ОВУ</tex>, которую дает данный взвешиваемый контекст.
<tex>PPMZ:\ Esc_z = \dfrac{\sum\limits_{i \in [0, 2]} w_{i}\cdot p_{i}}{\sum\limits_{i \in [0, 2]} w_{i}}</tex>