Sunteți pe pagina 1din 16

11/11/22, 6:21 PM Lucrarea3 - Canale discrete.

ipynb - Colaboratory

Obiectivul lucrarii
Lucrarea are ca scop studiul canalelor discrete fără memorie, pentru transmiterea informatiei. Vor
fi prezentate si analizate, din punct de vedere teoretic, cinci cazuri particulare: canalul binar
simetric, canalul binar cu anulari, canalul binar cu anulări și erori, canalul ternar simetric și canalul
Z. Desfășurarea lucrării se concentreaza pe studiul transinformației si capacității acestor categorii
de canale si pe intelegerea relatiilor intre entropiile proprii si cele conditionate.

Aspecte teoretice
Mediul fizic prin care se propaga mesajele de la surs la utilizator,
ce include si echipamentul
necesar transmisiunii datelor, poarta numele de canal de transmisiune a informat, iei. În figura sunt
reprezentate
grafic elementele ce alcatuiesc canalul de transmisiune.

Putem spune ca un canal este determinat daca se cunosc spatiul


de intrare -X ce descrie sursa S,
spatiul de iesire -Y , ce descrie receptia U si legatura probabilistica între cele doua P (Y |X) .

Parametrii spatiului de intrare:

1. Dimensiunea spatiului de intrare (numar de simboluri): n

2. Alfabetul: [X] = [x1 , x2 , . . , xn ]

3. Setul de probabilitati al simbolurilor din spatiul de intrare: P X = [p(x1 ), p(x2 ), . . . , p(xn )

4. Entropia campului de evenimente de la intrare:


n

H (X) = − ∑ p(xi ) ⋅ log p(xi ) [bit/simbol]$

i=1

Parametrii spatiului de iesire:


https://colab.research.google.com/gist/danielafaur/9b82000492bfd7d43b831cfbe46521f8/-lucrarea3-canale-discrete.ipynb#scrollTo=2GP9TcuHPNF2 1/16
11/11/22, 6:21 PM Lucrarea3 - Canale discrete.ipynb - Colaboratory

1. Dimensiunea spatiului de iesire (numar de simboluri): m

2. Alfabetul: [Y ] = [y 1 , y 2 , . . , y m ]

3. Setul de probabilitati al simbolurilor din spatiul de iesire: [P Y ] = [p(y 1 ), p(y 2 ), . . . , p(y m )]

4. Entropia campului de evenimente de la iesire:


m

H (Y ) = − ∑ p(y i ) ⋅ log p(y i ) [bit/simbol]

i=1

Pentru a descrie un canal de transmisiune discret trebuie sa definim matricea de zgomot P (X|Y )
si/sau graful de tranzitie asociat acesteia, prezentat in figura.

Considerand informatia transmisa, proprietatile fizice ale canalului se regasesc in matricea de


zgomot (tranzitie) prin distributia de probabilitati conditionate p(y j |xi ) :

p(y 1 |x1 ) p(y 2 |x1 ) ⋯ p(y m |x1 )


⎡ ⎤

⎢ p(y 1 |x2 ) p(y 2 |x2 ) ⋯ p(y m |x2 ) ⎥


P (Y |X) = ⎢ ⎥
⎢ ⎥
⎢ ⋯ ⋯ ⋯ ⋯ ⎥

⎣ ⎦
p(y 1 |xn ) p(y 2 |xn ) ⋯ p(y m |xn )

Spunem despre un simbol y j din spatiul de iesire ca este purtator de informatie daca acesta poate
oferi informatii despre simbolul emis la intrare, xi . Matricea de zgomot este stochastica:
m

∑ p(y j |xi ) = 1  ∀ i = 1..n

j=1

Altfel spus, daca la intrarea canalului se aplica un anumit simbol xi ∈ X , cu certitudine la iesirea
acestuia se va receptiona unul din simbolurile y j ∈ Y .

O masura a incertitudinii globale, definita pe ambele spatii este reprezentata de entropia campului
reunit intrare-iesire:
n m

H (X, Y ) = − ∑ ∑ p(xi , y j ) ⋅ log p(xi , y j ) [bit/simbol]

i=1 j=1

https://colab.research.google.com/gist/danielafaur/9b82000492bfd7d43b831cfbe46521f8/-lucrarea3-canale-discrete.ipynb#scrollTo=2GP9TcuHPNF2 2/16
11/11/22, 6:21 PM Lucrarea3 - Canale discrete.ipynb - Colaboratory

Pentru descrierea canalului din punct de vedere informational, sunt utilizate alte doua masuri
entropice, descrise mai jos:

Echivocatia exprima incertitudinea asupra transmiterii simbolului xi , daca a fost receptionat


simbolul y j :
n m

H (X|Y ) = − ∑ ∑ p(xi , y j ) ⋅ log p(xi |y j ) [bit/simbol]

i=1 j=1

Eroarea medie exprima incertitudinea receptionarii simbolului y j , in cazul in care a fost transmis
simbolul xi :
n m

H (Y |X) = − ∑ ∑ p(xi , y j ) ⋅ log p(y j |xi ) [bit/simbol]

i=1 j=1

In calculul acestor entropii intervin matricile P (X|Y ) , P (Y |X) 'si P (X, Y ) .

Relatiile dintre aceste entropii sunt evidentiate grafic in figura:

Intre aceste entropii exista relatiile:


H (Y |X) = H (X, Y ) − H (X)

H (X|Y ) = H (X, Y ) − H (Y )

Transinformatia reprezinta valoarea medie a informatiei mutuale transmise prin canal. Aceasta
marime este intotdeauna pozitiva si poate atinge valoarea 0 numai in cazul in care variabilele
aleatoare X si Y sunt independente.
I (X, Y ) = H (X) + H (Y ) − H (X, Y )

= H (Y ) − H (Y |X)

= H (X) − H (X|Y )

Capacitatea canalului reprezinta maximul transinformatiei, maxim ce se calculeaza in raport cu


setul de probabilitati de la intrare si depinde doar de proprietatile fizice ale canalului studiat.

C = max(I (X, Y )) = max[H (X) − H (X|Y )] = max[H (Y ) − H (Y |X)]

https://colab.research.google.com/gist/danielafaur/9b82000492bfd7d43b831cfbe46521f8/-lucrarea3-canale-discrete.ipynb#scrollTo=2GP9TcuHPNF2 3/16
11/11/22, 6:21 PM Lucrarea3 - Canale discrete.ipynb - Colaboratory

Desfășurarea lucrării

import numpy as np

from math import log2, log

from matplotlib import pyplot as plt

import warnings

warnings.filterwarnings('ignore')

# functie folosita pentru calcularea entropiei

def entropie(Xprob): 

    # X este lista ce contine probabilitatile simbolurilor 

    H = []

    for px in Xprob: 

        if px != 0: 

            H.append(px * log2(px))

    H = -sum(H)

    return H

Aplicatia 3.1 Determinarea transinformatiei canalelor discrete

Consideram un canal cu un alfabet de intrare [X]


definit de n simboluri. Alfabetul observat la
iesire, [Y ], contine m simboluri.

# Canal cu alfabet de intrare definit de n=3 simboluri

n = 3

# Alfabetul observat la iesire contine m=3 simboluri

m = 3

Matricea probabilitatilor conditionate, P (Y |X) , ce caracterizeaza canalul, este o matrice de


dimensiune nxm cu suma elementelor
fiecarei linii egala cu unitatea. Simbolurile de informatie
debitate de sursa la intrarea canalului se vor regasi într-un vector linie cu n elemente, fiecaruia
fiindu-i asociata o probabilitate de aparitie p(xi ) , aceste probabilitati fiind generate aleator.

#Genereaza o matrice de dimensiuni n si m cu numere aleator alese intre 0 si 1. 

#Matricea probabilitatilor conditionate P(X|Y)

P = np.random.dirichlet(np.ones(n),size=m)

print('P=',P)

#Probabilitatile simbolurilor de intrare

https://colab.research.google.com/gist/danielafaur/9b82000492bfd7d43b831cfbe46521f8/-lucrarea3-canale-discrete.ipynb#scrollTo=2GP9TcuHPNF2 4/16
11/11/22, 6:21 PM Lucrarea3 - Canale discrete.ipynb - Colaboratory

# p_x = np.random.dirichlet(np.ones(n), size=1)

p_x = np.random.rand(n)

p_x = p_x / sum(p_x)

print('Probabilitatea simbolurilor de intrare p(x): \n{}\n'.format(p_x))

P= [[0.06895784 0.86470965 0.06633251]

[0.00722269 0.61234034 0.38043697]

[0.18996343 0.05142682 0.75860975]]

Probabilitatea simbolurilor de intrare p(x):

[0.20048507 0.42538757 0.37412736]

#Genereaza o matrice de dimensiuni n si m cu numere aleator alese intre 0 si 1. 

#Matricea probabilitatilor conditionate P(X|Y)

P = np.array([[0.1, 0.1, 0.8], [0.21, 0.19, 0.6], [0.01, 0.01, 0.98]])

print('P=',P)

#Probabilitatile simbolurilor de intrare

# p_x = np.random.dirichlet(np.ones(n), size=1)

p_x = [0.4, 0.3, 0.3]

print('Probabilitatea simbolurilor de intrare p(x): \n{}\n'.format(p_x))

P= [[0.1 0.1 0.8 ]

[0.21 0.19 0.6 ]

[0.01 0.01 0.98]]

Probabilitatea simbolurilor de intrare p(x):

[0.4, 0.3, 0.3]

Probabilitatile simbolurilor sursei observate la iesirea canalului p(y j ) rezulta din relatia:
P (Y ) = P (X)P (Y |X) . Rezultatul acestei operatii este un vector cu m componente a caror
suma este 1, din moment ce acest vector reprezinta distributia de probabilitate a simbolurilor la
iesirea canalului.

p_y = np.dot(p_x, P)

print('Probabilitatea simbolurilor de iesire p(y): \n{}\n'.format(p_y))

Probabilitatea simbolurilor de iesire p(y):

[0.08796798 0.45308353 0.4589485 ]

Cunoscandu-se distributiile de probabilitate la intrarea si la iesirea canalului, folosind functia


entropie se pot calcula entropiile asociate H (X) , respectiv H (Y ) :

https://colab.research.google.com/gist/danielafaur/9b82000492bfd7d43b831cfbe46521f8/-lucrarea3-canale-discrete.ipynb#scrollTo=2GP9TcuHPNF2 5/16
11/11/22, 6:21 PM Lucrarea3 - Canale discrete.ipynb - Colaboratory

#Entropia la intrarea canalului

h_px = entropie(p_x)

#Entropia la iesirea canalului

h_py = entropie(p_y)

print('Entropia spatiului de intrare: H(X)=',h_px)

print('Entropia spatiului de iesire: H(Y)=',h_py)

Entropia spatiului de intrare: H(X)= 1.520039769827628

Entropia spatiului de iesire: H(Y)= 1.341655385220031

In conditiile observarii unui anumit simbol la iesire, se pot evalua probabilitati conditionate de acest
eveniment pentru fiecare simbol al sursei, notate P (x|y) = P (y|x) ∗ P (x)/P (y) . Suma
elementelor pe coloanele P (X|Y ) este 1.

p_xy = np.zeros((n, m))

for i in range(n):

    for j in range(m):

        p_xy[i][j] = P[i][j] * p_x[i] / p_y[j]

print('P(X|Y)=',p_xy)

P(X|Y)= [[0.15715966 0.38262565 0.02897641]

[0.03492682 0.57490938 0.35261725]

[0.80791352 0.04246497 0.61840634]]

Pentru fiecare dintre cele m observatii posibile la iesirea din canal, se calculeaza o entropie
aposteriori - dupa transmisie. Media acestor entropii, ce considera probabilitatile simbolurilor de la
iesire, reprezinta entropia sursei de intrare, conditionata de iesirea canalului, H (X|Y ) .

en_px = []

for i in range(m):

    en_px.append(entropie(p_xy[:,i]))

print('Entropii aposteriori: {}\n'.format(en_px))

h_xy = np.dot(p_y, np.transpose(en_px).reshape(-1, 1))

print('Entropia conditionata de iesirea observata H(X|Y): {}\n'.format(h_xy))

Entropii aposteriori: [0.8372147698792414, 1.1829735923805953, 1.1071007117801446]

Entropia conditionata de iesirea observata H(X|Y): [1.11773614]

https://colab.research.google.com/gist/danielafaur/9b82000492bfd7d43b831cfbe46521f8/-lucrarea3-canale-discrete.ipynb#scrollTo=2GP9TcuHPNF2 6/16
11/11/22, 6:21 PM Lucrarea3 - Canale discrete.ipynb - Colaboratory

Diferenta dintre entropia sursei de la intrarea canalului si echivocatie poarta numele de


transinformatie sau informatie mutuala si reprezinta cantitatea de informatie transmisa prin canal.
Transinformatia este variabila, valoarea acesteia depinzand de distributia de probabilitati a sursei
la intrarea canalului.
#calculul transinformatiei I(X,Y)=H(X)-H(X/Y)

transinformatia = h_px - h_xy

print('Transinformatia I(X|Y): {}'.format(transinformatia))

Transinformatia I(X|Y): [0.40230363]

Este important de mentionat faptul ca transinformatia este o marime simetrica: in cazul in care
intrarea este inlocuita cu iesirea, sau matricile de probabilitati conditionate se schimba intre ele,
valoarea transinformatiei ramane neschimbata. Aceasta observatie conduce la concluzia ca un
canal se comporta la fel in ambele directii.

import numpy as np

from math import log2, log

from matplotlib import pyplot as plt

import warnings

warnings.filterwarnings('ignore')

# functie folosita pentru calcularea entropiei

def entropie(Xprob): 

    # X este lista ce contine probabilitatile simbolurilor 

    H = []

    for px in Xprob: 

        if px != 0: 

            H.append(px * log2(px))

    H = -sum(H)

    return H

# Canal cu alfabet de intrare definit de n=3 simboluri

n = 3

# Alfabetul observat la iesire contine m=3 simboluri

m = 3

#Genereaza o matrice de dimensiuni n si m cu numere aleator alese intre 0 si 1. 

#Matricea probabilitatilor conditionate P(X|Y)

P = np.array([[0.1, 0.1, 0.8], [0.21, 0.19, 0.6], [0.01, 0.01, 0.98]])

print('P=',P)

#Probabilitatile simbolurilor de intrare

# p_x = np.random.dirichlet(np.ones(n), size=1)

p_x = [0.4, 0.3, 0.3]

print('Probabilitatea simbolurilor de intrare p(x): \n{}\n'.format(p_x))

https://colab.research.google.com/gist/danielafaur/9b82000492bfd7d43b831cfbe46521f8/-lucrarea3-canale-discrete.ipynb#scrollTo=2GP9TcuHPNF2 7/16
11/11/22, 6:21 PM Lucrarea3 - Canale discrete.ipynb - Colaboratory

p_y = np.dot(p_x, P)

print('Probabilitatea simbolurilor de iesire p(y): \n{}\n'.format(p_y))

#Entropia la intrarea canalului

h_px = entropie(p_x)

#Entropia la iesirea canalului

h_py = entropie(p_y)

print('Entropia spatiului de intrare: H(X)=',h_px)

print('Entropia spatiului de iesire: H(Y)=',h_py)

p_xy = np.zeros((n, m))

for i in range(n):

    for j in range(m):

        p_xy[i][j] = P[i][j] * p_x[i] / p_y[j]

print('P(X|Y)=',p_xy)

en_px = []

for i in range(m):

    en_px.append(entropie(p_xy[:,i]))

print('Entropii aposteriori: {}\n'.format(en_px))

h_xy = np.dot(p_y, np.transpose(en_px).reshape(-1, 1))

print('Entropia conditionata de iesirea observata H(X|Y): {}\n'.format(h_xy))

#calculul transinformatiei I(X,Y)=H(X)-H(X/Y)

transinformatia = h_px - h_xy

print('Transinformatia I(X|Y): {}'.format(transinformatia))

P= [[0.1 0.1 0.8 ]

[0.21 0.19 0.6 ]

[0.01 0.01 0.98]]

Probabilitatea simbolurilor de intrare p(x):

[0.4, 0.3, 0.3]

Probabilitatea simbolurilor de iesire p(y):

[0.106 0.1 0.794]

Entropia spatiului de intrare: H(X)= 1.5709505944546684

Entropia spatiului de iesire: H(Y)= 0.9396409109694069

P(X|Y)= [[0.37735849 0.4 0.40302267]

[0.59433962 0.57 0.22670025]

[0.02830189 0.03 0.37027708]]

Entropii aposteriori: [1.1222539783542114, 1.1427887687242424, 1.5445138154235767]

Entropia conditionata de iesirea observata H(X|Y): [1.45958177]

Transinformatia I(X|Y): [0.11136883]

https://colab.research.google.com/gist/danielafaur/9b82000492bfd7d43b831cfbe46521f8/-lucrarea3-canale-discrete.ipynb#scrollTo=2GP9TcuHPNF2 8/16
11/11/22, 6:21 PM Lucrarea3 - Canale discrete.ipynb - Colaboratory

Aplicatia 3.2 Cautarea aleatoare a capacitatii canalului


Capacitatea canalului se poate evalua analitic rezolvand o problema de extrem: probabilitatile
simbolurilor de la intrare sunt supuse restrictiei de a avea suma egala cu unitatea. Se impune o
valoare a limitei maxime pentru transinformatie, prin generarea aleatoare a mai multor surse de n
simboluri la intrare si evaluarea valorii informatiei mutuale pentru fiecare dintre acestea. In final se
va retine valorea maxima a transinformatiei, ce se apropie de valoarea capacitatii canalului.

#cautarea aleatoare a capacitatii canalului

trans_maxim = [];

for i in range(50):
    p_x = np.random.rand(n)
    p_x = p_x / sum(p_x)
    p_y = np.dot(p_x, P)
    h_px = entropie(p_x)
    p_xy = np.zeros((n, m))
    for i in range(n):
        for j in range(m):
            p_xy[i][j] = P[i][j] * p_x[i] / p_y[j]
    en_px = []
    for j in range(m):
        en_px.append(entropie(np.transpose(p_xy[:,j])))
    print('Probabilitatea sursei: {}'.format(p_x))
    print('Transinformatia: {}\n'.format(h_px - np.dot(p_y, np.transpose(en_px).reshape(-1,1)

    trans_maxim.append(h_px - np.dot(p_y, np.transpose(en_px).reshape(-1,1))) 

max_value = np.max(trans_maxim)
print('Transinformatia maxima este: ', max_value)

Probabilitatea sursei: [0.06732489 0.78697876 0.14569635]

Transinformatia: [0.08281722]

Probabilitatea sursei: [0.16214473 0.44743015 0.39042512]

Transinformatia: [0.15206942]

Probabilitatea sursei: [0.3698123 0.26713612 0.36305158]

Transinformatia: [0.11981251]

Probabilitatea sursei: [0.33765051 0.33933264 0.32301685]

Transinformatia: [0.12211801]

Probabilitatea sursei: [0.41794585 0.53819996 0.04385418]

Transinformatia: [0.0505948]

Probabilitatea sursei: [0.38074076 0.33366839 0.28559086]

https://colab.research.google.com/gist/danielafaur/9b82000492bfd7d43b831cfbe46521f8/-lucrarea3-canale-discrete.ipynb#scrollTo=2GP9TcuHPNF2 9/16
11/11/22, 6:21 PM Lucrarea3 - Canale discrete.ipynb - Colaboratory

Transinformatia: [0.11239756]

Probabilitatea sursei: [0.74651672 0.20697408 0.04650919]

Transinformatia: [0.03686927]

Probabilitatea sursei: [0.04857339 0.05230737 0.89911924]

Transinformatia: [0.06750091]

Probabilitatea sursei: [0.57987926 0.07421813 0.34590262]

Transinformatia: [0.07668736]

Probabilitatea sursei: [0.43259346 0.48404512 0.08336142]

Transinformatia: [0.06393062]

Probabilitatea sursei: [0.32076531 0.32068631 0.35854838]

Transinformatia: [0.12755388]

Probabilitatea sursei: [0.37730448 0.35617266 0.26652287]

Transinformatia: [0.11025956]

Probabilitatea sursei: [0.02279626 0.42960054 0.5476032 ]

Transinformatia: [0.18489231]

Probabilitatea sursei: [0.49296079 0.13739389 0.36964532]

Transinformatia: [0.09505739]

Probabilitatea sursei: [0.32734904 0.34416029 0.32849068]

Transinformatia: [0.12405442]

Probabilitatea sursei: [0.53796251 0.23976319 0.2222743 ]

Transinformatia: [0.08501912]

Probabilitatea sursei: [0.46633408 0.3963291 0.13733683]

Transinformatia: [0.07761021]

Probabilitatea sursei: [0.22635058 0.47033579 0.30331363]

Transinformatia: [0.13124927]

Probabilitatea sursei: [0.42101589 0.18418361 0.3948005 ]

Transinformatia: [0.10939906]

Transinformatia maxima este: 0 18489230805384238

Aplicatia 3.3.Capacitatea canalului binar simetric

Un canal se numeste simetric dacă fiecare simbol de intrare este


transformat într-un număr finit
de simboluri de ieșire, cu același set
de probabilități, indiferent de simbolul aplicat la intrare. Cu alte
cuvinte, un canal este simetric dacă orice simbol se eronează cu aceeași
probabilitate. În cazul
canalului binar simetric, alfabetul de intrare
este identic cu cel de la ieșire, [0, 1] .

Consecintele simetriei canalului:

https://colab.research.google.com/gist/danielafaur/9b82000492bfd7d43b831cfbe46521f8/-lucrarea3-canale-discrete.ipynb#scrollTo=2GP9TcuHPNF2 10/16
11/11/22, 6:21 PM Lucrarea3 - Canale discrete.ipynb - Colaboratory

1. Matricea de zgomot este simetrica


p(y 1 |x1 ) p(y 2 |x1 ) 1 − p p
P (Y |X) = [ ] = [ ]
p(y 1 |x2 ) p(y 2 |x2 ) p 1 − p

2. Graful de tranzitie este simetric

3. Eroarea medie nu depinde de probabilitatile simbolurilor din spatiul de intrare, ci numai de


perturbatiile de pe canal;
4. Capacitatea canalului se atinge pentru probabilitati egale ale
simbolurilor din spatiul de
intrare, p(x1 ) = p(x2 ) = 0.5

C = 1 + p log (p) + (1 − p) log (1 − p) [bit/simbol]


2 2

p = np.linspace(0, 1, num=1000)

H = - (1-p) * np.log2(1-p) - p * np.log2(p)

C = 1 - H

plt.plot(p, H, label="H(p)")

plt.plot(p, C, 'r', label="C(p)")

plt.legend()

plt.grid()

plt.show()

https://colab.research.google.com/gist/danielafaur/9b82000492bfd7d43b831cfbe46521f8/-lucrarea3-canale-discrete.ipynb#scrollTo=2GP9TcuHPNF2 11/16
11/11/22, 6:21 PM Lucrarea3 - Canale discrete.ipynb - Colaboratory

PROBLEMA. Calculati capacitatea canalului binar simetric de probabilitate


de eroare p = 0.2
modificând secventele de cod folosite
anterior. Repetati experimentul pentru p=0 si p=1.
n = 2

m = 2

p=1

P = np.array([[p, 1-p], [1-p, p]])

print('P(Y|X)=',P)

#formula capacitatii canalului C(p)este valabila pt p(x1)=p(x2)

#p_x= np.array([0.5, 0.5])

p_x = np.random.rand(n)

p_x = p_x / sum(p_x)

print('p_x=',p_x)

h_px = entropie(p_x)

print('entropia h_px=',h_px)

p_y = np.dot(p_x, P) 

print('p_y=',p_y)

h_py = entropie(p_y)

p_xy = np.zeros((n, m))

for i in range(n):

    for j in range(m):

        p_xy[i][j] = P[i][j] * p_x[i] / p_y[j]

print('P(X|Y)=',p_xy)

en_px = []

for i in range(m):

    en_px.append(entropie(np.transpose(p_xy[:,i])))

print('Entropii aposteriori: {}\n'.format(en_px))

h_xy = np.dot(p_y, np.transpose(en_px).reshape(-1,1))

print('Entropia conditionata de iesirea observata H(X|Y): {}\n'.format(h_xy))

#calculul transinformatiei I(X,Y)=H(X)-H(X/Y)

transinformatia = h_px - h_xy

print('Transinformatia I(X|Y): {}'.format(transinformatia))

P(Y|X)= [[1 0]

[0 1]]

p_x= [0.53079453 0.46920547]

entropia h_px= 0.9972620439479442


p_y= [0.53079453 0.46920547]

P(X|Y)= [[1. 0.]

[0. 1.]]

Entropii aposteriori: [-0.0, -0.0]

Entropia conditionata de iesirea observata H(X|Y): [0.]

Transinformatia I(X|Y): [0.99726204]

Aplicatie 3.4 Capacitatea canalului binar cu anulari si erori

https://colab.research.google.com/gist/danielafaur/9b82000492bfd7d43b831cfbe46521f8/-lucrarea3-canale-discrete.ipynb#scrollTo=2GP9TcuHPNF2 12/16
11/11/22, 6:21 PM Lucrarea3 - Canale discrete.ipynb - Colaboratory

Matricea de zgomot a canalului este:


1 − p − q p q
P (Y |X) = [ ]
p 1 − p − q q

Daca simbolurile de la intrarea in canal sunt echiprobabile, p(x1 ) = p(x2 ) =


1

2
, valoarea
capacitatii canalului devine:
C = (1 − q) + p ⋅ log p − (1 − q) ⋅ log2 (1 − q) + (1 − p − q) ⋅ log (1 − p − q) [bit/simbo
2 2

Calculati capacitatea canalului binar cu anulari si erori (n = 2, m = 3 ) pentru p = 0.1 si q = 0.4

folosind codul anterior cu modificarea datelor de intrare.

n = 2;

m = 3;

P=np.array([[0.5, 0.1, 0.4], [0.1, 0.5, 0.4]])

print(P)

p_x= np.array([0.5, 0.5])

print(p_x)

h_px = entropie(p_x)

print('entropia h_px=',h_px)

p_y = np.dot(p_x, P) 

print('p_y=',p_y)

h_py = entropie(p_y)

p_xy = np.zeros((n, m))

for i in range(n):

    for j in range(m):

        p_xy[i][j] = P[i][j] * p_x[i] / p_y[j]

print('P(X|Y)=',p_xy)

en_px = []

for i in range(m):

    en_px.append(entropie(np.transpose(p_xy[:,i])))

print('Entropii aposteriori: {}\n'.format(en_px))

h_xy = np.dot(p_y, np.transpose(en_px).reshape(-1,1))

print('Entropia conditionata de iesirea observata H(X|Y): {}\n'.format(h_xy))

https://colab.research.google.com/gist/danielafaur/9b82000492bfd7d43b831cfbe46521f8/-lucrarea3-canale-discrete.ipynb#scrollTo=2GP9TcuHPNF2 13/16
11/11/22, 6:21 PM Lucrarea3 - Canale discrete.ipynb - Colaboratory

#calculul transinformatiei I(X,Y)=H(X)-H(X/Y)

transinformatia = h_px - h_xy

print('Transinformatia I(X|Y): {}'.format(transinformatia))

#verificare

p=0.1

q=0.4

C=1-q +p*log2(p)-(1-q)*log2(1-q)+(1-p-q)*log2(1-p-q)

print(C)

[[0.5 0.1 0.4]

[0.1 0.5 0.4]]

[0.5 0.5]

entropia h_px= 1.0

p_y= [0.3 0.3 0.4]

P(X|Y)= [[0.83333333 0.16666667 0.5 ]

[0.16666667 0.83333333 0.5 ]]

Entropii aposteriori: [0.6500224216483542, 0.6500224216483542, 1.0]

Entropia conditionata de iesirea observata H(X|Y): [0.79001345]

Transinformatia I(X|Y): [0.20998655]

0.2099865470109874

Aplicatia 3.5 Divergenta Kullback Leibler


Presupunem variabila aleatoare discreta X ce caracterizeaz o sursa discreta fara memorie si
distributie de probabilitate P X - corespunzatoare simbolurilor emise de sursa si variabila aleataore
discreta Y , ce caracterizeaza iesirea canalului, de distributie QY .
[X] = [1, 2, 3, 4, 5, 6];

[Y ] = [1, 2, 3, 4, 5, 6];

1 1 1 1 1 1
[P X ] = [ ; ; ; ; ; ];
6 6 6 6 6 6

1 1 1 1 1 1
[QY ] = [ ; ; ; ; ; ]
10 10 10 10 10 2

Divergenta Kullback-Leibler, respectiv entropia relativa a varibilei X in raport cu variabila Y este:


p(xi )
DK L (P X ||QY ) = ∑ p(xi ) ⋅ log
q(y i )
i

Proprietati:

https://colab.research.google.com/gist/danielafaur/9b82000492bfd7d43b831cfbe46521f8/-lucrarea3-canale-discrete.ipynb#scrollTo=2GP9TcuHPNF2 14/16
11/11/22, 6:21 PM Lucrarea3 - Canale discrete.ipynb - Colaboratory

1. DK L (P ||Q) ≥ 0 ; egalitatea cu 0 se poate atinge doar pentru distributii identice (p = q );


2. DK L (P ||Q) ≠ DK L (Q||P ) : aceasta masura, nefiind simetrica, nu indeplineste
proprietatile de distanta in sensul strict al definitiei;
3. DK L (P ||Q) este o marime aditiva pentru evenimente aleatoare independente.

Se cere:

1. Calculul analitic al divergentei Kullback-Leibler pentru distributiile P X si QY ;


2. Implementarea unei functii in Pyhton ce calculeaza divergenta KL pentru distributiile de mai
sus.

def D_KL(p, q):

    d = np.zeros(p.size)

    D_pq = np.sum(np.multiply(p, np.log(np.divide(p, q))))

    D_qp = np.sum(np.multiply(q, np.log(np.divide(q, p))))

    return(D_pq + D_qp)

Rezolvare analitica:
Utilizand formula divergentei Kullback-Leibler prezentata anterior, putem
calcula:

D = DK L (P X ||QY ) + DK L (QY ||P X )

p(xi ) 1/6 1/6


DK L (P X ||QY ) = ∑ p(xi ) ⋅ log = 5 ⋅
1

6
⋅ +
1

6
⋅ = 0.2426

q(y i ) 1/10 1/2


i

q(y i ) 1 1/10 1 1/2


DK L (QY ||P X ) = ∑ q(y i ) ⋅ log = 5 ⋅ ⋅ + ⋅ = 0.2939
p(xi ) 10 1/6 2 1/6
i

asa incat:
D = DK L (QY ||P X ) + DK L (QY ||P X ) = 0.5365

p = np.array([1/6, 1/6, 1/6, 1/6, 1/6, 1/6])
q = np.array([1/10, 1/10, 1/10, 1/10, 1/10, 1/2])
print(D_KL(p, q))

#verificarea divergentei intrare iesire pentru un canal ternar
p_x=np.array([0.35, 0.25, 0.40])
p_y=np.array([0.22, 0.46, 0.32])
#print(sum(p_x))
#print(sum(p_y))
print(D_KL(p_x, p_y))

0.5364793041447002

0.20626198320256725

https://colab.research.google.com/gist/danielafaur/9b82000492bfd7d43b831cfbe46521f8/-lucrarea3-canale-discrete.ipynb#scrollTo=2GP9TcuHPNF2 15/16
11/11/22, 6:21 PM Lucrarea3 - Canale discrete.ipynb - Colaboratory

Colab paid products


-
Cancel contracts here

check 0s completed at 6:17 PM

https://colab.research.google.com/gist/danielafaur/9b82000492bfd7d43b831cfbe46521f8/-lucrarea3-canale-discrete.ipynb#scrollTo=2GP9TcuHPNF2 16/16

S-ar putea să vă placă și