Salta al contenuto
Note per Studenti Reti bayesiane - semantica, indipendenze e inferenza esatta

Reti bayesiane - semantica, indipendenze e inferenza esatta

In questa pagina 6

La congiunta completa (Incertezza - probabilità, regola di Bayes e indipendenza condizionataUn agente con osservazioni parziali non può usare regole logiche rigide ("mal di denti implica carie" è falso): usa la probabilità come grado di credenza e, con la teoria dell'utilità, sceglie l'azione con utilità attesa massima. Strumenti: distribuzione congiunta completa (tabella di $2^n$ valori), marginalizzazione $P(Y\mid e)=\alpha\sum_h P(Y,e,h)$ con costante di normalizzazione $\alpha=1/P(e)$, regola del prodotto $P(a,b)=P(a\mid b)P(b)$, regola di Bayes $P(\text{causa}\mid\text{effetto})=\frac{P(\text{effetto}\mid\text{causa})P(\text{causa})}{P(\text{effetto})}$ e indipendenza condizionata $P(a,b\mid c)=P(a\mid c)P(b\mid c)$, che permette di scomporre la congiunta in tabelle più piccole. Un test con sensibilità 73% e falsi positivi 12% su una malattia con prior 1/700 dà una probabilità a posteriori di appena 0,9%.Incertezza - probabilità, regola di Bayes e indipendenza condizionata →) risponde a qualsiasi domanda, ma ha ana^n numeri (aa = valori per variabile, nn = variabili): per tre booleane 23=82^3=8 valori (in realtà 77: l'ultimo si ricava dalla somma =1=1), per trenta più di un miliardo. Non si sa dove trovare i numeri e dove metterli. Le reti bayesiane (Bayesian networks, dette anche belief networks, modelli grafici probabilistici) la scompongono sfruttando le indipendenze condizionate.

Scomposizione della congiunta

Regola della catena. Per qualsiasi ordine delle variabili, per la regola del prodotto: P(x1,…,xn)=P(xn∣xn−1,…,x1) P(xn−1∣xn−2,…,x1)⋯P(x2∣x1) P(x1)=∏iP(xi∣xi−1,…,x1).P(x_1,\dots,x_n)=P(x_n\mid x_{n-1},\dots,x_1)\,P(x_{n-1}\mid x_{n-2},\dots,x_1)\cdots P(x_2\mid x_1)\,P(x_1)=\prod_{i}P(x_i\mid x_{i-1},\dots,x_1).

Se ogni XiX_i è indipendente da tutti i predecessori tranne un sottoinsieme Parents(Xi)⊆{X1,…,Xi−1}\text{Parents}(X_i)\subseteq\{X_1,\dots,X_{i-1}\} (i suoi genitori), nella catena rimangono solo i genitori:

Definizione (scomposizione in prodotto). P(x1,…,xn)=∏i=1nP(xi∣parents(Xi)).P(x_1,\dots,x_n)=\prod_{i=1}^n P\big(x_i\mid \text{parents}(X_i)\big).

Esempio. P(X1,X2,X3)=P(X3∣X1,X2)P(X2∣X1)P(X1)P(X_1,X_2,X_3)=P(X_3\mid X_1,X_2)P(X_2\mid X_1)P(X_1). Se X3X_3 è condizionalmente indipendente da X1X_1 dato X2X_2, diventa P(X3∣X2)P(X2∣X1)P(X1)P(X_3\mid X_2)P(X_2\mid X_1)P(X_1): X2X_2 è genitore di X3X_3, X1X_1 di X2X_2, X1X_1 non ha genitori.

Definizione (rete bayesiana). Un DAG (grafo diretto senza cicli) in cui:

  • ogni nodo è una variabile aleatoria;
  • un arco X→YX\to Y dice che XX è genitore di YY (di solito: XX è una causa di YY);
  • ogni nodo ha una tabella delle probabilità condizionate (conditional probability table, CPT) P(Xi∣Parents(Xi))\mathbf P(X_i\mid\text{Parents}(X_i)); un nodo senza genitori ha una distribuzione a priori.

La rete rappresenta la congiunta come prodotto delle CPT. Topologia + CPT = rappresentazione compatta, di solito semplice da costruire anche per non esperti.

Esempio. Nella rete con archi X→ZX\to Z, Y→ZY\to Z, Z→WZ\to W la congiunta è P(W,Z,X,Y)=P(W∣Z) P(Z∣X,Y) P(X) P(Y)\mathbf P(W,Z,X,Y)=\mathbf P(W\mid Z)\,\mathbf P(Z\mid X,Y)\,\mathbf P(X)\,\mathbf P(Y): ogni fattore è la CPT di un nodo condizionata ai suoi genitori.

Quanti numeri servono

Una CPT booleana con kk genitori ha 2k2^k righe e basta la colonna "vero" (quella "falso" è 1−p1-p). Per la distribuzione P(D)P(D), P(A∣D)P(A\mid D), P(B∣D)P(B\mid D) di tre booleane: 1+2+2=51+2+2=5 numeri invece di 77. Il vantaggio è anche statistico: stimando da 2525 campioni la congiunta P(A,B,D)P(A,B,D) ci sono 88 combinazioni, circa 33 campioni ciascuna; stimando P(A∣D)P(A\mid D), P(B∣D)P(B\mid D), P(D)P(D) ce ne sono circa 66, 66 e 1212 per ogni numero, quindi stime più affidabili.

Esempio: l'allarme antifurto

Un allarme suona per un furto (Burglary, BB) o per un terremoto (Earthquake, EE); i vicini Giovanni (JohnCalls, JJ) e Maria (MaryCalls, MM) telefonano se lo sentono. Archi B→AB\to A, E→AE\to A, A→JA\to J, A→MA\to M.

CPT valori
P(b)P(b) 0,0010{,}001
P(e)P(e) 0,0020{,}002
P(a∣B,E)P(a\mid B,E) b,eb,e: 0,950{,}95; b,¬eb,\neg e: 0,940{,}94; ¬b,e\neg b,e: 0,290{,}29; ¬b,¬e\neg b,\neg e: 0,0010{,}001
P(j∣A)P(j\mid A) aa: 0,900{,}90; ¬a\neg a: 0,050{,}05
P(m∣A)P(m\mid A) aa: 0,700{,}70; ¬a\neg a: 0,010{,}01

Cinque CPT, 1+1+4+2+2=101+1+4+2+2=10 numeri invece di 25−1=312^5-1=31.

Probabilità di un evento completo. P(j,m,a,¬b,¬e)P(j,m,a,\neg b,\neg e) è uno dei 3232 termini della congiunta: si moltiplicano le CPT, scegliendo per ogni nodo la riga dei valori dei genitori. P(j,m,a,¬b,¬e)=P(j∣a)P(m∣a)P(a∣¬b,¬e)P(¬b)P(¬e)=0,90⋅0,70⋅0,001⋅0,999⋅0,998=0,000628.P(j,m,a,\neg b,\neg e)=P(j\mid a)P(m\mid a)P(a\mid\neg b,\neg e)P(\neg b)P(\neg e)=0{,}90\cdot0{,}70\cdot0{,}001\cdot0{,}999\cdot0{,}998=0{,}000628. P(j,¬m,a,b,¬e)=P(j∣a)P(¬m∣a)P(a∣b,¬e)P(b)P(¬e)=0,90⋅0,30⋅0,94⋅0,001⋅0,998=0,00025329.P(j,\neg m,a,b,\neg e)=P(j\mid a)P(\neg m\mid a)P(a\mid b,\neg e)P(b)P(\neg e)=0{,}90\cdot0{,}30\cdot0{,}94\cdot0{,}001\cdot0{,}998=0{,}00025329. (Il primo è il numero verificato nel Esercizio - Prior sampling sulla rete burglary (laboratorio 6).)

Ordinamento e costruzione

Qualunque ordine delle variabili dà una rete corretta (la regola della catena vale sempre), ma gli archi cambiano. Un modello causale (i genitori sono le cause) è molto più compatto. Con l'ordine inverso M,J,E,B,AM,J,E,B,A i genitori diventano: JJ ha MM; EE ha M,JM,J; BB ha M,J,EM,J,E; AA ha tutti e quattro. I numeri sono 1+2+4+8+16=311+2+4+8+16=31, tanti quanti la congiunta, e le probabilità non hanno più un significato causale facile da stimare.

Le tre strutture elementari

Le indipendenze di una rete si leggono dal grafo guardando tre configurazioni di tre nodi X,Y,ZX,Y,Z:

struttura grafo XX e ZZ sono...
catena (head-to-tail) X→Y→ZX\to Y\to Z dipendenti; indipendenti dato YY
fork (tail-to-tail) X←Y→ZX\leftarrow Y\rightarrow Z dipendenti; indipendenti dato YY
collider (head-to-head) X→Y←ZX\to Y\leftarrow Z indipendenti; dipendenti dato YY

Sono le tre configurazioni con cui si compongono tutti i cammini del grafo; l'indipendenza condizionata usata è quella di Eventi indipendenti e indipendenza condizionataA e B sono indipendenti se P(AB) = P(A)P(B), cioè (se P(B) > 0) P(A | B) = P(A): sapere B non cambia la probabilità di A. Se A, B sono indipendenti lo sono anche A e Bᶜ. Tre eventi sono indipendenti se lo sono a coppie E P(ABC) = P(A)P(B)P(C): l'indipendenza a coppie non basta. Prove ripetute indipendenti: le probabilità si moltiplicano. Indipendenza condizionata a F: P(AB | F) = P(A | F)P(B | F); non implica l'indipendenza (due lanci della stessa moneta scelta a caso). Eventi disgiunti con probabilità positive non sono mai indipendenti.Eventi indipendenti e indipendenza condizionata →.

  • Catena. B→A→JB\to A\to J: il furto influenza la telefonata di Giovanni solo attraverso l'allarme. P(b∣j)=0,0163P(b\mid j)=0{,}0163 ma P(b∣j,a)=0,3736=P(b∣a)P(b\mid j,a)=0{,}3736=P(b\mid a): noto AA, JJ non dà altra informazione su BB.
  • Fork. J←A→MJ\leftarrow A\rightarrow M: AA è causa comune. Senza osservare AA, JJ e MM sono dipendenti: P(j∣m)=0,1776≠P(j)=0,0521P(j\mid m)=0{,}1776\ne P(j)=0{,}0521 (se Maria chiama, probabilmente l'allarme suona, quindi probabilmente chiama anche Giovanni). Noto AA: P(j∣a,m)=P(j∣a)=0,90P(j\mid a,m)=P(j\mid a)=0{,}90.
  • Collider. B→A←EB\to A\leftarrow E: furto e terremoto sono indipendenti, P(b,e)=0,000002=P(b)P(e)P(b,e)=0{,}000002=P(b)P(e). Ma se si osserva l'allarme diventano dipendenti: P(b∣a)=0,3736P(b\mid a)=0{,}3736; se si sa anche che c'è stato un terremoto, P(b∣a,e)=0,0033P(b\mid a,e)=0{,}0033: il terremoto spiega l'allarme e il furto diventa improbabile (explaining away). Se invece non c'è stato terremoto, P(b∣a,¬e)=0,4848P(b\mid a,\neg e)=0{,}4848.

Esempio dei dadi. XX = primo dado, YY = secondo dado, Z=X+YZ=X+Y: X→Z←YX\to Z\leftarrow Y. XX e YY sono indipendenti, ma se Z=7Z=7 e X=1X=1 allora Y=6Y=6: ZZ crea la dipendenza. Lo stesso avviene osservando un discendente del collider (se si sapesse solo che Giovanni ha chiamato, BB e EE diventerebbero dipendenti: P(b∣j)=0,0163P(b\mid j)=0{,}0163 ma P(b∣j,e)=0,0029P(b\mid j,e)=0{,}0029).

Un nodo è inoltre indipendente dai suoi non discendenti dati i genitori: per l'allarme, JJ è indipendente da BB, EE e MM dato AA. Il ragionamento sui cammini del grafo (quali sono bloccati dall'evidenza) è il punto di partenza dell'inferenza causale: Interventi e operatore do - criterio backdoor e aggiustamentoOsservare $X=x$ e forzare $X=x$ sono cose diverse: $P(y\mid x)\ne P(y\mid do(x))$ quando c'è un confondente. L'intervento $do(X=x)$ si calcola con la «chirurgia» del grafo (si tolgono le frecce entranti in X) e si traduce in probabilità osservazionali con la formula di aggiustamento $P(y\mid do(x))=\sum_z P(y\mid x,z)P(z)$, dove $Z$ sono i genitori di X, o più in generale un insieme S che soddisfa il criterio backdoor: blocca ogni cammino backdoor (cammino da X a Y che inizia con una freccia entrante in X) e non contiene discendenti di X. Effetto causale medio $ACE=P(y\mid do(x))-P(y\mid do(\neg x))$. Se il confondente non è osservabile ma c'è un mediatore Z con X→Z→Y, vale il front-door $P(y\mid do(x))=\sum_z P(z\mid x)\sum_{x'}P(y\mid x',z)P(x')$. Mediazione: effetto diretto controllato CDE con $do(x),do(z)$. Se due insiemi backdoor danno risultati diversi sui dati, il modello è sbagliato. Argomento del corso da 9 CFU.Interventi e operatore do - criterio backdoor e aggiustamento →.

Inferenza per enumerazione

Problema. Data l'evidenza e\mathbf e (variabili osservate E\mathbf E), calcolare P(X∣e)\mathbf P(X\mid\mathbf e) per una variabile di interrogazione XX. Le variabili Y\mathbf Y né osservate né interrogate sono nascoste. Si usa la marginalizzazione: P(X∣e)=α P(X,e)=α∑yP(X,e,y),\mathbf P(X\mid\mathbf e)=\alpha\,\mathbf P(X,\mathbf e)=\alpha\sum_{\mathbf y}\mathbf P(X,\mathbf e,\mathbf y), dove α=1/P(e)=1/∑xP(x,e)\alpha=1/P(\mathbf e)=1/\sum_x P(x,\mathbf e) normalizza. Ogni termine P(X,e,y)P(X,\mathbf e,\mathbf y) è una congiunta completa, quindi un prodotto di CPT.

Algoritmo (enumeration-ask). Per ogni valore xx di XX: sommare, sui valori delle variabili nascoste, il prodotto delle CPT nell'ordine topologico (genitori prima dei figli); poi normalizzare. Si calcola in profondità e da sinistra a destra, portando fuori dalle somme i fattori che non dipendono dalla variabile sommata.

Esempio completo: P(B∣j,m)\mathbf P(B\mid j,m)

Con evidenza j,mj,m le nascoste sono EE e AA: P(B∣j,m)=α⟨P(b,j,m), P(¬b,j,m)⟩\mathbf P(B\mid j,m)=\alpha\langle P(b,j,m),\,P(\neg b,j,m)\rangle. P(b,j,m)=∑e∑aP(b)P(e)P(a∣b,e)P(j∣a)P(m∣a)=P(b)∑eP(e)∑aP(a∣b,e)P(j∣a)P(m∣a).P(b,j,m)=\sum_e\sum_a P(b)P(e)P(a\mid b,e)P(j\mid a)P(m\mid a)=P(b)\sum_e P(e)\sum_a P(a\mid b,e)P(j\mid a)P(m\mid a). P(b)P(b) esce da entrambe le somme; P(e)P(e) esce dalla somma su aa. Numeri (per ee, poi per ¬e\neg e): P(b,j,m)=0,001 [ 0,002 (0,95⋅0,9⋅0,7+0,05⋅0,05⋅0,01)+0,998 (0,94⋅0,9⋅0,7+0,06⋅0,05⋅0,01) ]P(b,j,m)=0{,}001\,[\,0{,}002\,(0{,}95\cdot0{,}9\cdot0{,}7+0{,}05\cdot0{,}05\cdot0{,}01)+0{,}998\,(0{,}94\cdot0{,}9\cdot0{,}7+0{,}06\cdot0{,}05\cdot0{,}01)\,]

  • somma su aa con ee: 0,95⋅0,63+0,05⋅0,0005=0,5985250{,}95\cdot0{,}63+0{,}05\cdot0{,}0005=0{,}598525 (dove P(j∣a)P(m∣a)=0,9⋅0,7=0,63P(j\mid a)P(m\mid a)=0{,}9\cdot0{,}7=0{,}63 e P(j∣¬a)P(m∣¬a)=0,05⋅0,01=0,0005P(j\mid\neg a)P(m\mid\neg a)=0{,}05\cdot0{,}01=0{,}0005);
  • somma su aa con ¬e\neg e: 0,94⋅0,63+0,06⋅0,0005=0,592230{,}94\cdot0{,}63+0{,}06\cdot0{,}0005=0{,}59223;
  • 0,002⋅0,598525+0,998⋅0,59223=0,59224260{,}002\cdot0{,}598525+0{,}998\cdot0{,}59223=0{,}5922426; per 0,0010{,}001: P(b,j,m)=0,0005922P(b,j,m)=0{,}0005922.

Per ¬b\neg b: P(¬b,j,m)=0,999 [ 0,002 (0,29⋅0,63+0,71⋅0,0005)+0,998 (0,001⋅0,63+0,999⋅0,0005) ]=0,999⋅(0,000366+0,001127)=0,0014919.P(\neg b,j,m)=0{,}999\,[\,0{,}002\,(0{,}29\cdot0{,}63+0{,}71\cdot0{,}0005)+0{,}998\,(0{,}001\cdot0{,}63+0{,}999\cdot0{,}0005)\,]=0{,}999\cdot(0{,}000366+0{,}001127)=0{,}0014919. Normalizzazione: α=10,0005922+0,0014919=479,82\alpha=\dfrac1{0{,}0005922+0{,}0014919}=479{,}82 e P(B∣j,m)=⟨0,284; 0,716⟩.\mathbf P(B\mid j,m)=\langle0{,}284;\ 0{,}716\rangle. Anche se entrambi i vicini chiamano, la probabilità di furto è solo 28%28\%: l'allarme scatta spesso per altre cause e il prior 0,0010{,}001 è bassissimo.

python
# rete burglary: per ogni variabile (genitori, CPT) con CPT = P(X=vero | genitori)
bn = {
    'B': ([], {(): 0.001}),
    'E': ([], {(): 0.002}),
    'A': (['B', 'E'], {(True, True): 0.95, (True, False): 0.94,
                       (False, True): 0.29, (False, False): 0.001}),
    'J': (['A'], {(True,): 0.90, (False,): 0.05}),
    'M': (['A'], {(True,): 0.70, (False,): 0.01}),
}
ordine = ['B', 'E', 'A', 'J', 'M']          # ordine topologico

def prob(var, val, ev):
    """P(var=val | genitori), con i valori dei genitori presi da ev."""
    genitori, cpt = bn[var]
    p = cpt[tuple(ev[g] for g in genitori)]
    return p if val else 1 - p

def enumera_tutto(variabili, ev):
    """Somma sulle variabili non osservate, nell'ordine topologico."""
    if not variabili:
        return 1.0
    v, resto = variabili[0], variabili[1:]
    if v in ev:                              # osservata: un solo termine
        return prob(v, ev[v], ev) * enumera_tutto(resto, ev)
    return sum(prob(v, x, {**ev, v: x}) * enumera_tutto(resto, {**ev, v: x})
               for x in (True, False))       # nascosta: si somma sui due valori

def enumeration_ask(X, ev):
    q = [enumera_tutto(ordine, {**ev, X: x}) for x in (True, False)]
    alfa = 1 / sum(q)                        # normalizzazione
    return [alfa * p for p in q]

print(enumeration_ask('B', {'J': True, 'M': True}))

Output atteso: [0.2841718353643929, 0.7158281646356071].

Costo. La ricorsione visita un albero con una foglia per ogni assegnazione delle nascoste: costo esponenziale nel loro numero. Inoltre molti sottoprodotti si ripetono: nell'albero del calcolo precedente P(j∣a)P(m∣a)=0,9⋅0,7P(j\mid a)P(m\mid a)=0{,}9\cdot0{,}7 e P(j∣¬a)P(m∣¬a)=0,05⋅0,01P(j\mid\neg a)P(m\mid\neg a)=0{,}05\cdot0{,}01 compaiono sia sotto ee sia sotto ¬e\neg e, e vengono ricalcolati.

Eliminazione di variabili

L'idea è salvare i risultati intermedi in tabelle, i fattori (factors), e riusarli. Un fattore f(X1,…,Xk)f(X_1,\dots,X_k) è una tabella di numeri indicizzata dai valori delle variabili (non è per forza una distribuzione).

Due operazioni:

  • prodotto puntuale (pointwise product): f⋅gf\cdot g ha come variabili l'unione delle variabili e come valore il prodotto dei valori compatibili;
  • somma (sum out) di una variabile: si sommano le righe che differiscono solo per quella variabile, che sparisce.

Algoritmo (variable elimination). Si scrive ogni CPT come fattore (fissando le variabili d'evidenza ai valori osservati, che le toglie dai fattori). Per ogni variabile nascosta, in un ordine scelto: si moltiplicano tutti i fattori che la contengono e si somma la variabile. Alla fine si moltiplicano i fattori rimasti e si normalizza.

Esempio: P(B∣j,m)\mathbf P(B\mid j,m). Fattori (con j,mj,m fissati): fJ(A)=P(j∣A)=⟨0,9; 0,05⟩f_J(A)=P(j\mid A)=\langle0{,}9;\ 0{,}05\rangle, fM(A)=P(m∣A)=⟨0,7; 0,01⟩f_M(A)=P(m\mid A)=\langle0{,}7;\ 0{,}01\rangle, fA(A,B,E)=P(A∣B,E)f_A(A,B,E)=P(A\mid B,E), fE(E)f_E(E), fB(B)f_B(B).

  1. Eliminare AA. Prodotto fJfM(A)=⟨0,63; 0,0005⟩f_J f_M(A)=\langle0{,}63;\ 0{,}0005\rangle; poi g(B,E)=∑afA(a,B,E) fJfM(a)g(B,E)=\sum_a f_A(a,B,E)\,f_Jf_M(a):

    ee ¬e\neg e
    bb 0,5985250{,}598525 0,592230{,}59223
    ¬b\neg b 0,1830550{,}183055 0,00112950{,}0011295

    Per esempio g(¬b,e)=0,29⋅0,63+0,71⋅0,0005=0,183055g(\neg b,e)=0{,}29\cdot0{,}63+0{,}71\cdot0{,}0005=0{,}183055. Sono esattamente le somme interne dell'enumerazione, ma calcolate una volta sola.

  2. Eliminare EE. h(B)=∑efE(e) g(B,e)h(B)=\sum_e f_E(e)\,g(B,e): h(b)=0,002⋅0,598525+0,998⋅0,59223=0,5922426h(b)=0{,}002\cdot0{,}598525+0{,}998\cdot0{,}59223=0{,}5922426 e h(¬b)=0,002⋅0,183055+0,998⋅0,0011295=0,0014934h(\neg b)=0{,}002\cdot0{,}183055+0{,}998\cdot0{,}0011295=0{,}0014934.

  3. Moltiplicare per fBf_B e normalizzare. ⟨0,001⋅0,5922426; 0,999⋅0,0014934⟩=⟨0,0005922; 0,0014919⟩→⟨0,284; 0,716⟩\langle0{,}001\cdot0{,}5922426;\ 0{,}999\cdot0{,}0014934\rangle=\langle0{,}0005922;\ 0{,}0014919\rangle\to\langle0{,}284;\ 0{,}716\rangle ✓.

È lo stesso metodo del laboratorio sullo sprinkler (Esercizio - Rete sprinkler per enumerazione e variable elimination (laboratorio 5)), dove i fattori sono chiamati ΦS(W,R)\Phi_S(W,R) e ΦR(W)\Phi_R(W). L'ordine di eliminazione conta per il costo (il fattore più grande che si crea determina la complessità), ma il risultato è sempre lo stesso. Esempio svolto: Esercizio - Eliminazione di variabili nella rete burglary (slide del corso).

Domande d'esame

  1. Quale congiunta rappresenta la rete X→Z←YX\to Z\leftarrow Y, Z→WZ\to W? P(W∣Z)P(Z∣X,Y)P(X)P(Y)P(W\mid Z)P(Z\mid X,Y)P(X)P(Y).
  2. Quanti numeri servono per la rete dell'allarme e per la congiunta? 1010 contro 25−1=312^5-1=31.
  3. Calcolare P(j,¬m,a,b,¬e)P(j,\neg m,a,b,\neg e). 0,90⋅0,30⋅0,94⋅0,001⋅0,998=0,000253290{,}90\cdot0{,}30\cdot0{,}94\cdot0{,}001\cdot0{,}998=0{,}00025329.
  4. In X→Z←YX\to Z\leftarrow Y, XX e YY sono indipendenti? E dato ZZ? Sì senza osservare ZZ; no se si osserva ZZ (o un suo discendente).
  5. Perché i modelli causali sono preferibili? Con genitori = cause la rete ha meno archi e meno numeri (allarme: 1010 contro 3131 con l'ordine invertito) e le CPT hanno un significato stimabile.

Versione ripasso

Esercizi su questo argomento

Teoria collegata