1 Compresión sin perdidas

Anuncio
1
1.1
Compresión sin perdidas
Notaciones
Un mensaje ~xN = {x1 , x2 , ..., xN } se transmite utilizando sı́mbolos de un
alfabeto A = {a1 , a2 , ..., an }, xi ∈ A.
1.2
Entropı́a
La probabilidad del mensaje P (~xN ) se puede representar como
P (xN , ..., x2 , x1 ) = P (xN |~xN −1 )P (~xN −1 ).
Si el descodificador ya ha recibido el mensaje xN −1 , ..., x2 , x1 , el descodificador
puede predecir xN . Esta es una posibilidad de compresión del mensaje.
El teorema de Shannon (1940) afirma que existe codificación de un mensaje ~x con d− log2 P (~x)e bits.
La entropı́a de los mensajes se define como:
H=−
X
P (~x) log2 P (~x) = −hlog2 P (~x)i [bits]
~
x
Según el teorema de Shannon 1) es posible la codificación de los mensajes
~xN con longitud N con dHe bits o lo que es el mismo la letra xN con
h− log2 P (xN |~xN −1 )i [bits].
2) No es posible mejor codificación de los mensajes con una determinada
función de distribución P (~xN ).
Si dos mensajes ~x y ~y son estadı́sticamente independientes, el mensajeconcatenación tiene entropı́a H(~x, ~y ) = H(~x)+H(~y ) y no se puede transmitir
con menos bits. Si la longitud de los mensajes es muy grande, se puede
aproximar el lı́mite entrópico.
Si suponemos que todas las letras de un mensaje son independientes,
entonces los bits por letra son:
Hletra = −
X
pi log2 pi = hlog2 pi i.
y el problema consiste en encontrar una codificación de las letras del alfabeto
con mı́nimo número de bits.
La codificación de letras se consigue con códigos de Huffman o codificación
aritmética.
1
2
Códigos de Huffman
Construcción:
0. Inicialización: Separamos las letras en clases, bi = {Ai , pi , ci } =
{{ai }, pi , {ci }} es decir, cada letra en clase separada. Inicialmente ci = ””.
1. Elegimos las clases menos probables – bi y bj , pi ≤ pj ≤ pk , ∀k 6= i, j.
2. Unimos las clases i y j a b = {Ai + Aj , pi + pj , {”0” + ci , ”1” + cj }}.
La suma de cadenas significa concatenación.
3. Las clases bi y bj se excluyen del conjunto de clases y se añade la clase
b.
4. Si hay más de una clase se repiten los pasos 1-4. Si hay solo una clase
– se para el algoritmo.
Al final tenemos los códigos y las letras en la única clase. El proceso se
puede presentar como construcción de un árbol.
Ejemplo:
pa = 1/4, pb = 1/4, pc = 1/2
b1 = {{a}, 1/4, ””}, b2 = {{b}, 1/4, ””}, b3 = {{c}, 1/2, ””}.
i = 1, j = 2.
b = {{a, b}, 1/4 + 1/4, {”0”, ”1”}}
b4 = {{a, b}, 1/2, {”0”, ”1”}}, b3 = {{c}, 1/2, ””}.
2 clases – repetir 1-4.
i = 4, j = 3.
b = {{a, b, c}, 1/2 + 1/2, {”00”, ”01”, ”1”}}
b5 = {{a, b, c}, 1, {”00”, ”01”, ”1”}}
Hay solo una clase. Los códigos de a, b, c son ”00”,”01”,”1”.
Los códigos de Huffman dan como máximo un bit de diferencia por
carácter en respeto con la codificación óptima de Shannon. Un bit es mucho
si se compara por ejemplo con 1.3 - 1.6 bits que se pueden conseguir como
compresión por carácter de gzip.
Los códigos de Huffman no adaptativos necesitan estimación de las probabilidades de las letras en el alfabeto.
Ejercicio: Para un alfabeto de 2 letras {a, b} y probabilidades de las
letras pa = 3/4 y pb = 1/4, el código de Huffman proporciona codificación
suboptimal. Dar estimación de la longitud media de un mensaje con codificación de Huffman y comparar esta estimación con el lı́mite entropico.
0.
1.
2.
3.
4.
1.
2.
3.
4.
2
3
Códigos de Elias (codificación aritmética)
Si sabemos la probabilidad de cada carácter podemos conseguir códigos muy
próximos al limite del Shannon utilizando codificación aritmética.
Los códigos de Elias funcionan en la siguiente manera:
Para cada letra ai con probabilidad pi , se divide el intervalo [0, 1] a partes
no solapantes Xi = [bi , ci ) con longitud pi .
Una posible elección de los intervalos por ejemplo seria:
bi =
i−1
X
pi
j=1
ci =
i
X
pi
j=1
El mensaje se codifica con un subintervalo de [0, 1]. El intervalo inicial es
[0, 1] que corresponde a un mensaje vacı́o. Codificamos sı́mbolo por sı́mbolo.
Si el intervalo en un momento dado de la codificación es [b, c), con la
siguiente letra ai el intervalo cambiara a: [b + bi (c − b), b + ci (c − b)).
Ejemplo Un alfabeto de dos letras a y b, con probabilidades pa = 3/4 y
pb = 1/4. Asignamos los intervalos Xa = [0, 3/4), Xb = [3/4, 1).
El mensaje es ”baa”.
Codificamos:
b
ba
baa
- [3/4,1)
- [3/4,3/4+3/16)=[12/16,15/16)
- [12/16,12/16+9/64)
Los códigos de Elias sufren de los siguientes defectos:
1) Hay que esperar el final del mensaje para emitirlo.
2) Requieren precisión “infinita”.
3) Requieren la función de distribución pi .
Por tanto no se pueden utilizar en su forma original.
Los códigos “aritméticos” son una modificación realizable de los códigos
de Elias. Los cambios principales son 2:
Primero: early emit:
* Si en un momento dado de la codificación el intervalo [b, c) está enteramente entre 0 y 0.5 se emite el bit 0 y se duplican los intervalos correspondientes.
3
* Si el intervalo está completamente entre 0.5 y 1 se emite el bit 1 y se
duplica el intervalo [b, c), ignorando la parte entera.
Segundo: Se limita la precisión de los números b y c. Si se desborda un
número determinado de bits, se añade un sı́mbolo especial que no pertenece
al alfabeto y se emiten todos los bits de b.
La codificación aritmética se puede hacer adaptativa, por ejemplo con el
siguiente procedimiento:
1) Se elige un número entero N > 0. La probabilidad a-priori de los
sı́mbolos del alfabeto ai se elije fija al principio. P (ai ) = ni /N , donde ni son
enteros.
2) Con cada letra ai se incrementa ni y N y se recalcula la probabilidad
de cada sı́mbolo.
4
Algoritmos de tipo LZ
Consiste en codificar el mensaje con su pasado.
El primer sı́mbolo se emite tal como está x1 .
Si hemos codificado los simbolos hasta xi−1 y tratamos de codificar los
sı́mbolos xi , xi+1 , ... , buscamos en la cadena x1 , ..., xi−1 la posición j que
coincide con el principio de xi , xi+1 , ... y tiene máxima longitud:
(j, L) = arg max xj+k = xi+k , k = 0...L − 1.
L
La salida es (i − j, L, xi+L ). La salida se puede codificar con códigos aritméticos o de Huffman. La diferencia i − j se puede limitar a una longitud
W , llamada “ventana”.
Ejemplo de programa: gzip.
Ejemplo: Codificamos:
abba abba abba .... 10001 veces.
Tenemos la siguiente salida:
(0,0,a),
(0,0,b),
(1,1,a),
(0,0,’ ’),
(5,10000,EOF).
4
5
Compresión basada a BWT
5.1
Resumen
Los algoritmos consisten en los siguientes pasos:
1) Añadimos el sı́mbolo EOF al final del fichero.
2) Invertimos el fichero (optativo).
3) BWT: Hacemos todas las rotaciones del texto y ordenamos en orden
alfabético.
4) La ultima columna la codificamos utilizando la técnica R2F “rotate to
first”.
5) Codificamos el resultado de la transformada, utilizando por ejemplo
código aritmético.
5.2
Ejemplo
Si utilizamos @ para EOF y el mensaje es:
banana@
Invertimos el fichero:
@ananab
todas las rotaciones son:
@ananab
ananab@
nanab@a
anab@an
nab@ana
ab@anan
b@anana
Ordenando estas cadenas:
@ananab
ab@anan
anab@an
ananab@
5
b@anana
nab@ana
nanab@a
La salida de esta fase (BWT) es:
bnn@aaa
Se puede ver que las letras iguales se “agrupan” juntos. La justificación
intuitiva del algoritmo es que la ultima columna es una “función” de los
anteriores, y ordenados dan agrupación de caracteres iguales.
R2F: Elegimos permutación inicial del alfabeto, por ejemplo: (a, b, n, @).
Codificamos con el número consecutivo en esta ordenación la primera letra
(empezando con 0). Movemos la letra codificada al principio de la permutación:
bnn@aaa
nn@aaa
n@aaa
@aaa
aaa
aa
a
(a,b,n,@)
(b,a,n,@)
(n,b,a,@)
(n,b,a,@)
(@,n,b,a)
(a,@,n,b)
(a,@,n,b)
Salida:
Salida:
Salida:
Salida:
Salida:
Salida:
Salida:
1.
2.
0.
3.
3.
0.
0.
Codificamos 1, 2, 0, 3, 3, 0, 0 utilizando codificación aritmética o código de
Huffman. Por la agrupación de las letras iguales tendrá una predominancia
de ceros y números pequeños.
5.3
Transformada inversa a BWT
Los pasos invertir cadena, R2F y codificación aritmética tienen evidentes
inversas. El paso BWT se puede invertir en la manera siguiente:
1) tenemos la última columna:
......b
......n
......n
......@
......a
......a
......a
6
2) La primera columna es una ordenación alfabética de la ultima y podemos recuperarla:
@.....b
a.....n
a.....n
a.....@
b.....a
n.....a
n.....a
3) Porque se trata de rotaciones del texto, la primera y la segunda
columna son la última columna concatenada con la primera y ordenadas
en orden alfabético. De la misma manera podemos recuperar las demás
columnas.
@a....b
ab....n
an....n
an....@
b@....a
na....a
na....a
La programación eficaz se hace con técnicas mas complicadas.
Ejemplo programa: bzip2 (unos 30% mejor que gzip).
7
Descargar