Documente Academic
Documente Profesional
Documente Cultură
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.
i=1
2. Alfabetul: [Y ] = [y 1 , y 2 , . . , y m ]
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.
⎣ ⎦
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
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
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:
i=1 j=1
Eroarea medie exprima incertitudinea receptionarii simbolului y j , in cazul in care a fost transmis
simbolul xi :
n m
i=1 j=1
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 )
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
# 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.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))
#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))
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))
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)
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)
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))
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
transinformatia = h_px - h_xy
print('Transinformatia I(X|Y): {}'.format(transinformatia))
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))
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
#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)
Transinformatia: [0.08281722]
Transinformatia: [0.15206942]
Transinformatia: [0.11981251]
Transinformatia: [0.12211801]
Transinformatia: [0.0505948]
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]
Transinformatia: [0.03686927]
Transinformatia: [0.06750091]
Transinformatia: [0.07668736]
Transinformatia: [0.06393062]
Transinformatia: [0.12755388]
Transinformatia: [0.11025956]
Transinformatia: [0.18489231]
Transinformatia: [0.09505739]
Transinformatia: [0.12405442]
Transinformatia: [0.08501912]
Transinformatia: [0.07761021]
Transinformatia: [0.13124927]
Transinformatia: [0.10939906]
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
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
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]]
[0. 1.]]
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
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
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.5]
0.2099865470109874
[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
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
Se cere:
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:
6
⋅ +
1
6
⋅ = 0.2426
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
https://colab.research.google.com/gist/danielafaur/9b82000492bfd7d43b831cfbe46521f8/-lucrarea3-canale-discrete.ipynb#scrollTo=2GP9TcuHPNF2 16/16