PPMとは?
PPMというのは、既出したデータから次の文字を予測して、確率を変化させる
ことにより圧縮するものである。
例えば abcdabcdabcdabc○
と来て○に入る文字は何だろうと考えてみたとき、dが出やすいというのは直感的に
わかる。そういう場合はdの確率を上げ、他の文字の出現確率を下げる。すると、圧縮
される。たぶんわからないと思うので、詳しく説明します。
確率を上げるとなぜ圧縮率が上がるか?
例えば8種類の文字 a,b,c,d,e,f,g,h があって、それを0と1で表すのならば
a:000
b:001
c:010
d:011
e:100
f:101
g:110
h:111
(方法A)
とそれぞれに3bit割り振ればよい。つまり一文字に付き3bit使う。
これに対し、もし8つの文字にばらつきがある、つまり出現確率が違う場合には
多く出てくる文字に対し小さい文字を割り当ててみる。
例としてa が 確率 1/2 で、 b,c,d,e,f,g,h が 確率 1/14 で出現するとする。
そのとき
a:0
b:1000
c:1001
d:1010
e:1011
f:1100
g:1101
h:1110
(方法B)
と割り当てを変えたとする。
方法Aの場合 3 * 1/2 + 7 * 3 * 1/14 = 3
方法Bの場合 1 * 1/2 + 7 * 4 * 1/14 = 2.5
と小さくなる。
このとき出現確率pのものをどのくらいの長さのbit数で表せばもっとも小さくなるのか
これは、「-log2(p)」 という長さのビット数で表すと最も短いことがわかります。
直感的に 1/2で出現するものは1bitで表現したらよさそう 確かに -log2(1/2) = 1
1/4 2 -log2(1/4) = 2
これに対しaの出現確率がp = 99/100 bの出現確率がp = 1/100
の場合、aは-log2(99/100) = 0.014bit b は -log2(1/100) = 6.66bitで表せばよいことがわかる。
0.014bitで表現できるのか?0か1でないと表現できないんじゃないのか?
と思うかもしれませんが、これは算術圧縮(実用的にはrangecoder)によって実現できます。 |