Teoria da Informação COMPRESSÃO ARITMÉTICA Epifanio Diniz Giovani Facchini Renato Costa.
Transcript of Teoria da Informação COMPRESSÃO ARITMÉTICA Epifanio Diniz Giovani Facchini Renato Costa.
Teoria da Informação
COMPRESSÃOARITMÉTICA
Epifanio Diniz
Giovani Facchini
Renato Costa
Motivação
Considere uma fonte com alfabeto A={a1, a2, a3), com P(a1)=0.95, P(a2)=0.02 e P(a3)=0.03. A entropia, o código de Huffman e o tamanho médio do código estão dispostos abaixo.
H=0.335 bits/símboloTamanho médio=1.05 bits/símbolo
Diferença de 0.715 bits/símbolo que é 213% da entropia!
Letra Probabilidade Código
a1 0.95 0
a2 0.02 11
a3 0.03 10
Motivação
• A codificação aritmética resolve o problema de probabilidades acumuladas.
• Bastante útil também com pequenos alfabetos.
Idéia Principal
• É mais eficiente atribuir um código para um seqüência em particular do que gerar um código para cada símbolo.
• Identificador ÚNICO é gerado para representar a seqüência, este é uma fração binária.
• Ao contrário do algoritmo de Huffman, que precisa de códigos para cada seqüência possível (crescimento exponencial), a Codificação Aritmética gera um código único.
Codificação
• Para distinguir uma seqüência de símbolos é necessário criar um código único. O código pode ser um número dentro do intervalo [0,1).
• Necessitamos de uma função mapeando as seqüências nesse intervalo. A função chama-se função de distribuição acumulativa.
Modelo Matemático
• Mapeamento dos símbolos da fonte em números:
X(ai)=i ai Є A
• Onde A={a1,a2,...,am} é o alfabeto de entrada. X é a variável randômica. A função de densidade de probabilidade para a variável randômica é dada por:
P(X = i) = P(ai)
• E a função de densidade cumulativa é dada por:
Fx(i) = ∑ik=1 P(X = k)
Gerando uma Tag
• Exemplo: considere um alfabeto de três letras A={a1,a2,a3}, com P(a1)=0.7, P(a2)=0.1 e P(a3)=0.2. Com a função de densidade temos Fx(1)=0.7, Fx(2)=0.8 e Fx(3 )=1. Particionando o intervalo como na figura a seguir:
Procedimento Matemático
• Para facilitar, começaremos com uma seqüência de tamanho 1. Para o alfabeto A mapeamos cada símbolo para números reais com a fórmula:
• Analogamente podemos afirmar:
• Com isso, cada símbolo do alfabeto de entrada tem um valor único. Este é exatamente o ponto intermediário do intervalo, mas podemos pegar qualquer número dentro do intervalo para representar o código de entrada.
Procedimento Matemático
• Agora veremos o procedimento para geração de uma tag de uma seqüência de comprimento inteiro qualquer. Para a seqüência xi temos:
• Onde y < x significa que y precede x na ordem e o sobrescrito significa o tamanho da seqüência.
Geração do Limite Superior e Inferior
• Para conseguir o limite superior e inferior do intervalo que queremos avaliar temos:
• Com isso temos o intervalo no qual podemos escolher um número qualquer. Para pegar-se o ponto intermediário usa-se:
Exemplo - Codificação
Expressar a frase “SWISS_MISS” em um número, através do método de Codificação Aritmética por Deslocamento.
Caracter Freqüência Probabilidade Intervalo CumFreqS 5 5 / 10 = 0.5 [0.5, 1.0) 5W 1 1 / 10 = 0.1 [0.4, 0.5) 4I 2 2 / 10 = 0.2 [0.2, 0.4) 2
M 1 1 / 10 = 0.1 [0.1, 0.2) 1_ 1 1 / 10 = 0.1 [0.0, 0.1) 0
LOW=0000, HIGH=9999
NovoLow = VelhoLow + Intervalo*IntervaloLow(X)
NovoHigh = VelhoLow + Intervalo*InvertaloHigh(X)
Intervalo = VelhoHigh - VelhoLow
Exemplo - Codificação
L= 0 + ( 1 – 0 )*0.5 = 0.5 5000 5000
H= 0 + ( 1 – 0 )*1.0 = 1.0 9999 9999
L= 0.5 + ( 1 – 0.5 )*0.4 = 0.7 7000 7 0000
H= 0.5 + ( 1 – 0.5 )*0.5 = 0.75 7499 7 4999
L= 0 + ( 0.5 - 0 )*0.2 = 0.1 1000 1 0000
H= 0 + ( 0.5 - 0 )*0.4 = 0.2 1999 1 9999
L= 0 + ( 1 – 0 )*0.5 = 0.5 5000 5000
H= 0 + ( 1 – 0 )*1.0 = 1.0 9999 9999
L= 0.5 + ( 1 – 0.5 )*0.5 = 0.75 7500 7500
H= 0.5 + ( 1 – 0.5 )*1.0 = 1.0 9999 9999
S
W
I
S
S
Char Cálculo do index Low/High
L= 0.75 + ( 1 – 0.75 )*0.0= 0.75 7500 7 5000
H= 0.75 + ( 1 – 0.75 )*0.1=0.775 7749 7 7499
L= 0.5 + (0.75 – 0.5)*0.1=0.525 5250 5 2500
H= 0.5 + (0.75 – 0.5)*0.2 = 0.55 5499 5 4999
L= 0.25 + (0.5 – 0.25)*0.2 = 0.3 3000 3 0000
H= 0.25 + (0.5 – 0.25)*0.4 =0.35 3499 3 4999
L= 0 + ( 0.5 – 0 )*0.5 =0.25 2500 2500
H= 0 + ( 0.5 – 0 )*1.0 = 0.5 4999 4999
L= 0.25 + (0.5 – 0.25)*0.5=0.375 3750 3750
H= 0.25 + (0.5 – 0.25)*1.0 = 0.5 4999 4999
_
M
I
S
S
Char Cálculo do index Low/High
Valor de saída:
717533750
Exemplo - Codificação
Exemplo - Decodificação
index = ((Code-Low+1)*10-1)/(High-Low+1)
Low = Low+(High-Low+1) * LowCumFreq[X]/10
High = Low+(High-Low+1) * HighCumFreq[X]/10-1
LOW=0000, HIGH=9999, CODE = 7175
1. index= [(7175 - 0 + 1) x 10 - 1]/(9999 - 0 + 1) = 7.1759
-> 7. Symbol "s" is selected.
Low = 0 + (9999-0+ 1) x 5/10 = 5000.
High = 0+ (9999-0+ 1) x 10/10-1 = 9999.
2. index= [(7175 - 5000 + 1) x 10 - 1]/(9999 - 5000 + 1) = 4.3518
-> 4. Symbol "w" is selected.
Low = 5000 + (9999 - 5000 + 1) x 4/10 = 7000.
High = 5000 + (9999 - 5000 + 1) x 5/10 - 1 = 7499.
After the 7 is shifted out, Low=0000, High=4999, and Code=1753.
Exemplo - Decodificação
3. index= [(1753 - 0 + 1) x 10 - 1]/(4999 - 0 + 1) = 3.5078
-> 3. Symbol "I" is selected.
Low = 0+ (4999 -0+ 1) x 2/10 = 1000.
High = 0+ (4999 - 0+ 1) x 4/10-1 = 1999.
After the 1 is shifted out, Low=0000, High=9999, and Code=7533.
4. index= [(7533 - 0 + 1) x 10 - 1]/(9999 - 0 + 1) = 7.5339
-> 7. Symbol "s" is selected.
Low = 0+(9999-0+ 1) x 5/10 = 5000.
High = 0+(9999-0+ 1) x 10/10-1 = 9999.
Exemplo - Decodificação
5. index= [(7533 - 5000 + 1) x 10 - 1]/(9999 - 5000 + 1) = 5.0678
-> 5. Symbol "s" is selected.
Low = 5000 + (9999 - 5000 + 1) x 5/10 = 7500.
High = 5000 + (9999 - 5000 + 1) x 10/10 -1 = 9999.
6. index= [(7533 - 7500 + 1) x 10 - 1]/(9999 - 7500 -I- 1) = 0.1356
-> 0. Symbol "u" is selected.
Low = 7500 + (9999 - 7500 + 1) x 0/10 = 7500.
High = 7500 + (9999 - 7500 + 1) x 1/10 - 1 = 7749.
After the 7 is shifted out, Low=5000, High=7499, and Code=5337.
Exemplo - Decodificação
7. index= [(5337 - 5000 + 1) x 10 - 1]/(7499 - 5000 + 1) = 1.3516
-> 1. Symbol "M" is selected.
Low = 5000 + (7499 - 5000 + 1) x 1/10 = 5250.
High = 5000 + (7499 - 5000 + 1) x 2/10 - 1 = 5499.
After the 5 is shifted out, Low=2500, High=4999, and Code=1375.
8. index= [(3375 - 2500 + 1) x 10 - 1]/(4999 - 2500 + 1) = 3.5036
-> 3. Symbol "I" is selected.
Low = 2500 + (4999 - 2500 + 1) x 2/10 = 3000.
High = 2500 + (4999 - 2500 + 1) x 4/10-1 = 3499.
After the 3 is shifted out, Low=0000, High=4999, and Code=3750.
Exemplo - Decodificação
9. index= [(3750 - 0 + 1) x 10 - 1]/(4999 - 0 + 1) = 7.5018
-> 7. Symbol "s" is selected.
Low = 0+(4999-0+1) x 5/10 = 2500.
High = 0+ (4999-0+ 1) x 10/10-1 = 4999.
10. index= [(3750 - 2500 + 1) x 10 - 1]/(4999 - 2500 + 1) = 5.0036
-> 5. Symbol "s" is selected.
Low = 2500 + (4999 - 2500 + 1) x 5/10 = 3750.
High = 2500 + (4999 - 2500 + 1) x 10/10 - 1 = 4999.
Exemplo - Decodificação