Для сжатия данных используют как статистические, так и эвристические
алгоритмы. Статистические алгоритмы для своей работы требуют знания
вероятностей появления символов в тексте. Как правило, эти вероятности
неизвестны. Для их оценки используют частоты символов. Однако, при
однопроходной обработке файла, эти частоты также неизвестны. Поэтому все
статистические алгоритмы можно поделить на три класса:
* неадаптивные - используют фиксированые, наперед заданые вероятности
символов. Таблица вероятностей символов не передается вместе с файлом, т.к.
она заранее известна. Недостаток: узкий класс файлов для которых достигается
приемлемый уровень сжатия.
* полуадаптивные - для каждого файла строят таблицу частот символов и с ее
помощью сжимают файл. Вместе с сжатым файлом передается таблица символов.
Такие алгоритмы достаточно хорошо сжимают большинство файлов, но требуется
дополнительная передача таблицы частот символов.
* адаптивные - начинают работать с фиксированной начальной таблицей частот
символов (обычно все символы изначально одинаково вероятны) и в процессе
работы это таблица изменяется в зависимости от встречаемых символов файла.
Преимущества: однопроходность алгоритма; также как и неадаптивные алгоритмы,
не требуется передача таблицы частот символов, но достаточно эффективно
сжимается широкий класс файлов.
Эвристические алгоритмы сжатия (типа LZ77, LZ78), как правило, ищут повторяющиеся строки в файле, либо строят словарь как уже встречавшихся фраз, так и фраз, которые наиболее вероятно могут появится в тексте.
Обычно такие алгоритмы обладают целым рядом специфических параметров (размер буфера, максимальная длина фразы, размер рассматриваемого контекста и т.п.), подбор которых зависит от опыта автора алгоритма, и эти параметры подбираются так, чтобы добиться оптимального сочетания времени работы, коэффициента сжатия и широты класса хорошо сжимаемых файлов.
При подборе этих параметров можно заметить, что для различных файлов (текстовые, двоичные, базы данных) оптимальны различные сочетания параметров, не говоря уже о том, что разные алгоритмы оптимальны для разных классов исходных файлов.
Идея суперадаптивного сжатия заключается в адаптивности параметров сжимающего алгоритма, т.е. параметры алгоритма, или же сами алгоритмы сжатия, могут меняться в зависимости от текущего распределения частот символов в обрабатываемом файле. Алгоритм при этом остается однопроходным.
Вся тонкость заключается в решении о принадлежности данного файла к тому или иному классу. Можно заметить, что для файлов того или иного класса свойственно определенное распределение частот символов. Конечно, для каждого файла распределение частот уникально, но у файлов одного класса эти распределения не сильно различаются. Таким образом проблема сводится к определению вида распределения символов к которому ближе всего в данный момент распределение символов обрабатываемого файла.
Мерой близости одного распределения частот символов к другому может служить количество информации. В отличие от Шенноновской энтропии, существует несколько различных определений количества информации. Это связано с условиями, которые накладываются на нее. Этим условиям удовлетворяет несколько различных функций. Не вдаваясь в математические подробности, скажем самое главное: эта функция должна обращаться в ноль при равенстве распределений и положительной в других случаях.
Примерная схема суперадаптивного сжатия:
* Нам известны несколько различных алгоритмов сжатия и распределения частот
для которых они оптимальны. Стартуем с фиксированного распределения частот и
соответствующего ему алгоритма.
* Используя текущий алгоритм кодируем N очередных символов текста, изменяем
таблицу частот встреченных символов, подсчитывает количество информации для
все известных распределений, определяем распределение к которому ближе всего
текущее распределение символов (для него значение количества информации
наименьшее), выбираем соответствующий ему алгоритм. И опять повторяем тоже
самое для всего файла.
Обозначим Pi и Qi частоты символов текста и частоты символов при которых оптимален некий алгоритм сжатия.
N N
SUM Pi = SUM Qi = 1
i=1 i=1
Тогда количество информации можно определить следующими способами:
N
Kullback SUM Qi * log(Qi/Pi)
i=1
N
Kullback SUM Pi * log(Pi/Qi)
i=1
N
Kullback SUM (Qi-Pi) * log(Qi/Pi)
i=1
N 2
Matusita SQRT( SUM Pi * (SQRT(Qi/Pi)-1) )
i=1
1 N
Kolmogoroff - * SUM Pi * ABS(Qi/Pi-1)
2 i=1
N
Bhattacharyya -log( SUM Pi * SQRT(Qi/Pi) )
i=1
N 2
Kagan SUM Pi * (1-Qi/Pi)
i=1
Обобщение N 2
наименьших квадратов SQRT( SUM Qi * (Pi/Qi) - 1 )
i=1
Обозначения: Ниже приводятся значения различных количеств информации для файлов различных типов. Наиболее удобны для практической реализации варианты Kullbackа и Kaganа. Также приводится значение энтропии символа исследуемых файлов.
+++++ File: t.zip +++++
Shannon's Hentropy = 7.9980
Kullback's information gain = 0.0020
Kullback's reversed information gain = 0.0020
Kullback's divergency = 0.0040
Matusita information gain = 0.0262
Kolmogoroff's information gain = 0.0000
Bhattacharyya information gain = 0.0005
Kagan's information gain = 0.0027
MNS generalisation = 0.0527
+++++ File: DEFCAT.DB +++++
Shannon's Hentropy = 3.4174
Kullback's information gain = 4.5826
Kullback's reversed information gain = 2.3148
Kullback's divergency = 6.8974
Matusita information gain = 0.9575
Kolmogoroff's information gain = 0.3652
Bhattacharyya information gain = 0.8847
Kagan's information gain = 88.4309
MNS generalisation = 2.2684
+++++ File: FILELIST.DOC +++++
Shannon's Hentropy = 4.7476
Kullback's information gain = 3.2524
Kullback's reversed information gain = 0.2492
Kullback's divergency = 3.5016
Matusita information gain = 0.7056
Kolmogoroff's information gain = 0.3633
Bhattacharyya information gain = 1.2889
Kagan's information gain = 20.1490
MNS generalisation = 2.8623
+++++ File: l12.prt +++++
Shannon's Hentropy = 5.0039
Kullback's information gain = 2.9961
Kullback's reversed information gain = 1.2768
Kullback's divergency = 4.2729
Matusita information gain = 0.7841
Kolmogoroff's information gain = 0.3398
Bhattacharyya information gain = 1.0078
Kagan's information gain = 17.1672
MNS generalisation = 3.4860
+++++ File: sources.c +++++
Shannon's Hentropy = 5.6431
Kullback's information gain = 2.3569
Kullback's reversed information gain = 0.4507
Kullback's divergency = 2.8076
Matusita information gain = 0.6489
Kolmogoroff's information gain = 0.2871
Bhattacharyya information gain = 0.8291
Kagan's information gain = 10.1830
MNS generalisation = 1.5086
+++++ File: hi.exe +++++
Shannon's Hentropy = 6.6845
Kullback's information gain = 1.3155
Kullback's reversed information gain = 0.9956
Kullback's divergency = 2.3111
Matusita information gain = 0.5948
Kolmogoroff's information gain = 0.1777
Bhattacharyya information gain = 0.2808
Kagan's information gain = 7.8968
MNS generalisation = 1.5113
DEFCAT.DB - база данных Paradox
M 2
SUM log ( Pi/Qi )
i=1
При выборе языка и кодировки, имеющих наименьшее значение количества
информации, вычисленного по этой формуле, достигалась наименьшая
ошибка в определении языка и кодировки по частоте наиболее часто
встречающихся N-грамм (N <= 5).
| Изменена 30.12.2006 14:27 MSK |
|
|