¿Qué es el método de Shannon?
Se refiere a la probabilidad de aparición de cada símbolo en un mensaje, básicamente se utiliza para la compresión de datos.
Un poco de historia
Este método de codificación fue desarrollado por
Claude Shannon en los laboratorios Bell y por Robert Fano en MIT (Massachussets
Institute of Technology) en la década del 40 casi simultáneamente. La técnica
fue propuesta por Claude Elwood Shannon, en “Una TeoríaMatemática de la
Comunicación”, su artículo de 1948 introduciendo el campo de la teoría de la
información. El método fue atribuido a Robert Fano, quien posteriormente lo
publicó como uninforme técnico.
Propiedades Tablas de códigos
vDiferentes
códigos, tienen diferentes tipos de bits
vLos
códigos para símbolos con bajas probabilidades tienen más bits
vLos
códigos para símbolos con altas probabilidades tienen menos bits
vCódigos
de longitud diferente pueden ser unívocamente decodificados
¿Qué es la entropía?
vLa
entropía se refiere a la cantidad de bits necesarios para representar un
símbolo
En
un símbolo = - log2 (probabilidad)
En un mensaje = suma de la entropía de
sus símbolos
Utilización del método
1.- Para una secuencia de símbolos, se calcula la correspondiente lista de
frecuencias de aparición de los símbolos.
DDABEBADACABAAECDCBAEACA
BCBAADDEAACAEAB
wA = 15 ; B = 7; C = 6; D = 6; E =
5
Total de veces que se repite cada símbolo en
la series
2.- Se ordena la lista de símbolos según su frecuencia en orden decreciente.
Frecuencia: Veces que aparece
cada letra o símbolo en la serie a transmitir
3.- Se divide la lista en dos partes, de forma que la suma total de frecuencias
de la mitad superior sea lo más cercana posible a la suma total de la parte
inferior.
4.- A la mitad superior de la lista se le asigna el dígito binario 0, y a la mitad
inferior se le asigna el dígito binario 1. Esto significa que los códigos de
los símbolos en la primera mitad empezarán todos con 0 y los códigos en la
segunda mitad empezarán todos con 1.
5.- Cada una de las mitades, se subdivide en grupos y se agregan bits (digitos
binarios) a los códigos hasta que cada grupo conste de un único símbolo.
6.- Se pueden representar los símbolos a modo de árbol binario
7.- Se calcula la entropía como:
X = Largo de la serie / frecuencia
Entropía = Log 2 (X)
8.- Una vez calculada la entropía se calcula la entropía en el mensaje
(cantidad de bits necesarios para representar el símbolo en el mensaje)
Entropia
* frecuencia del símbolo
9.- Finalmente el cálculo de los bits de código a
transmitir está dado por la representación binaria (0,1) del símbolo y los bits de mensajes es la multiplicación de
los bits de códigos * la frecuencia del símbolo
10.- Conclusión
vSi
codificáramos esta secuencia de símbolos utilizando 8 bits, utilizaríamos en
total 312 bits (8 * 39 = 312).
vSi
utilizáramos Shannon sólo usaríamos 89 bits.
Ejemplo de código de Shannon
Codificar con codificación de Shannon la siguiente frase: "anita lava la tina"
Código en Matlab:
clc;
clear all;
close all;
aa=fopen('anitalavandera.txt');
bb=fread(aa);
cc=unique(bb); %Encuentra caracteres usados
taas=length(bb);
for n=1:length(cc)
d(n,1)=length(find(bb==cc(n))); %Cuenta la aparición de cada caracter
end
ss=transpose(d)./taas;
ss=sort(ss,'descend');
siling=ceil(log2(1/ss(1)));
sf=0;
fano=0;
n=1;Hs=0;
for iii=1:length(ss)
Hs=Hs+ ss(iii)*log2(1/ss(iii));
end
shano=ss(1);
for o=1:length(ss)-1
fano=fano+ss(o);
sf=[sf 0]+[zeros(1,o) fano];
siling=[siling 0]+[zeros(1,o) ceil(log2(1/ss(o+1)))];
end
for r=1:length(sf)
esf=sf(r);
for p=1:siling(r)
esf=mod(esf,1)*2;
h(p)=esf-mod(esf,1);
end
hh(r)=h(1)*10^(siling(r)-1);
for t=2:siling(r)
hh(r)=hh(r)+h(t)*10^(siling(r)-t);
end
end
c={'0','1'};
for i=1:length(hh)
u=1;
for t=siling(i):-1:1
f=floor(hh(i)/10^(t-1));
hh(i)=mod(hh(i),10^(t-1));
if f==1
if u==1
d=c{2};
else
d=[d c{2}];
end
else
if u==1
d=c{1};
else
d=[d c{1}];
end
end
codex{i,:}={d};
u=u+1;
end
end
tao=siling(1)*ss(1);
for u=1:length(ss)-1
tao=tao+siling(u+1)*ss(u+1);
end
T=tao/n;
B=[flipud(rot90(ss)),flipud(rot90(siling)),flipud(rot90(sf))];
disp([' S',' Li',' Pk'])
disp(B)
disp('Code')
disp(codex)
disp(['Hs = ',num2str(Hs)])
disp(['T = ',num2str(T),'bits/symbol'])
disp([num2str(Hs),' <= ',num2str(T),' <= ',num2str(Hs+1)])
Resultados:
S Li Pk
0.3333 2.0000 0
0.1667 3.0000 0.3333
0.1111 4.0000 0.5000
0.1111 4.0000 0.6111
0.1111 4.0000 0.7222
0.1111 4.0000 0.8333
0.0556 5.0000 0.9444
Hs = 2.5997
T = 3.2222bits/symbol
2.5997 <= 3.2222 <= 3.5997
Referencias:
Archivo de la facultad de ingeniería de la Universidad de las Américas.
Referencias:
Archivo de la facultad de ingeniería de la Universidad de las Américas.
Link para descargar el archivo de MatLab:
http://www.mediafire.com/download/g2ams42gd425qm5/shannonanita.rar