====== Informazione mutua puntuale ======
===== Uguaglianze e definizioni =====
Formula della probabilità congiunta applicata ai bigrammi:
$$
1)\hspace{4pt} P(x_{t}=a,\hspace{4pt}x_{t+1}=b)=P(x_{t+1}=b\hspace{4pt}|\hspace{4pt} x_{t}=a)P(x=a)
$$
Probabilità condizionata (discende da 1):
$$
2)\hspace{4pt} P(x_{t+1}=b\hspace{4pt}|\hspace{4pt} x_{t}=a)= \frac{P(x_{t}=a,\hspace{4pt}x_{t+1}=b)}{P(x=a)}
$$
Mutua informazione puntuale:
$$
3)\hspace{4pt} IMP=log_{2}\hspace{4pt}\frac{P(x_{t+1}=b\hspace{4pt}|\hspace{4pt} x_{t}=a)}{P(x=b)}
$$
Sostituendo in base a 2):
$$
4)\hspace{4pt} IMP=log_{2}\hspace{4pt}\frac{P(x_{t}=a,\hspace{4pt}x_{t+1}=b)}{P(x=a)P(x=b)}
$$
In base alla definizione dell'informazione:
$$
5a)\hspace{4pt} I(x=a)\hspace{4pt}=\hspace{4pt}log_{2}\hspace{4pt}\frac{1}{P(x=a)}\hspace{4pt}=\hspace{4pt}-log_{2}P(x=a)
$$
Da 4) e 5a), per le proprietà dei logaritmi:
$$
5b)\hspace{4pt} IMP\hspace{4pt}=\hspace{4pt}
log_{2}\hspace{4pt}\frac{1}{P(x=a)}\hspace{4pt}+\hspace{4pt}log_{2}\hspace{4pt}\frac{1}{P(x=b)}\hspace{4pt}
+\hspace{4pt} log_{2}\hspace{4pt} P(x_{t}=a,\hspace{4pt}x_{t+1}=b) \hspace{4pt} =$$
$$= \hspace{4pt}
I(x=a)+I(x=b)-I(x_{t}=a,\hspace{4pt}x_{t+1}=b)
$$
===== Comportamento dell'informazione mutua puntuale =====
Se le probabilità dei due elementi del bigramma sono perfettamente indipendenti l'una dall'altra allora:
$$
6a)\hspace{4pt} P(x_{t+1}=b\hspace{4pt}|\hspace{4pt} x_{t}=a)= P(x=b)
$$
Da 3) e 6a):
$$
6b)\hspace{4pt} IMP\hspace{4pt}=\hspace{4pt}log_{2}\hspace{4pt}\frac{P(x=b)}{P(x=b)}\hspace{4pt}=\hspace{4pt}log_{2}\hspace{4pt}1=0
$$
-------
Se, data la conoscenza del primo elemento, si ha la certezza dell'occorrenza del secondo allora:
$$
7a) \hspace{4pt} P(x_{t+1}=b\hspace{4pt}|\hspace{4pt} x_{t}=a)= 1
$$
Da 3) e 7a):
$$
7b)\hspace{4pt} IMP\hspace{4pt}=\hspace{4pt}log_{2}\hspace{4pt}\frac{1}{P(x=b)}\hspace{4pt}=\hspace{4pt}I(x=b)
$$
====== Funzioni in python ======
import re
from numpy import log2
#preparazione del testo "Pinocchio"
f=open('collodi_pinocchio.txt', mode='r', encoding='iso-8859-1')
testo=f.read()
testo=testo[1704:]
testo=re.sub("'","' ", testo)
testo=re.sub('[.,;:\-?!]','',testo)
testo=testo.lower()
testo=testo.split()
#funzioni
def NGRAMMI (n, testo):
return [tuple(testo[i:i+n]) for i in range(len(testo)+1-n)]
def I (x, testo):
return -log2(testo.count(x)/len(testo))
def P (x, testo):
return testo.count(x)/len(testo)
def IMP (a,b,testo):
bigrammi = NGRAMMI(2,testo)
return log2(P((a,b),bigrammi)/(P(a,testo)*P(b,testo)))
#return I(a,testo) + I(b,testo)-I((a,b),bigrammi)
#test
print("IMP di 'il burattino'")
print(IMP('il', 'burattino', testo))
print("\n")
print("IMP di 'capelli turchini'")
print(IMP('capelli', 'turchini', testo))
print("\n")
print("IMP di 'è di'")
print(IMP('è', 'di', testo))
print("\n")
import re
from numpy import log2
#preparazione del testo "Pinocchio"
f=open('testi/collodi_pinocchio.txt', mode='r', encoding='iso-8859-1')
testo=f.read()
testo=testo[1704:]
testo=re.sub("'","' ", testo)
testo=re.sub('[\.,;:\-?!]{1}','',testo)
testo=testo.lower()
testo=testo.split()
#funzioni
NGRAMMI = lambda n, testo: [tuple(list(['$$$']*(n-1)+testo)[i:i+n]) for i in range(len(testo))]
I = lambda x, testo: -log2(testo.count(x)/len(testo))
bigrammi = NGRAMMI(2,testo)
print("IMP di 'il burattino'")
print(I('il',testo) + I('burattino',testo)-I(('il','burattino'),bigrammi))
print("\n")
print("IMP di 'capelli turchini'")
print(I('capelli',testo) + I('turchini',testo)-I(('capelli','turchini'),bigrammi))