Рассчитайте и интерпретируйте энтропию Шеннона для дискретного источника с заданным распределением вероятностей p = {0.5, 0.25, 0.25}, обсудите связь энтропии с сжатием информации и приведите пример кода (или псевдокода) простого алгоритма кодирования для этого источника
Рассчёт энтропии: Пусть p={0.5,0.25,0.25}p=\{0.5,0.25,0.25\}p={0.5,0.25,0.25}. Энтропия Шеннона определяется как H(X)=−∑ipilog2pi.
H(X)=-\sum_i p_i\log_2 p_i. H(X)=−i∑pilog2pi.
Подставляя значения, H(X)=−(0.5log20.5+0.25log20.25+0.25log20.25).
H(X)=-\big(0.5\log_2 0.5 + 0.25\log_2 0.25 + 0.25\log_2 0.25\big). H(X)=−(0.5log20.5+0.25log20.25+0.25log20.25).
Так как log20.5=−1\log_2 0.5=-1log20.5=−1 и log20.25=−2\log_2 0.25=-2log20.25=−2, 0.5log20.5=−0.5,0.25log20.25=−0.5,
0.5\log_2 0.5=-0.5,\quad 0.25\log_2 0.25=-0.5, 0.5log20.5=−0.5,0.25log20.25=−0.5,
и H(X)=−(−0.5−0.5−0.5)=1.5 бит/символ.
H(X)=-(-0.5-0.5-0.5)=1.5\ \text{бит/символ}. H(X)=−(−0.5−0.5−0.5)=1.5бит/символ. Интерпретация и связь с сжатием: - Энтропия H(X)=1.5H(X)=1.5H(X)=1.5 бита — это средняя минимальная неопределённость (количество информации) о символе источника в битах. - Для безошибочного (без потерь) кодирования средняя длина кода на символ LLL удовлетворяет оценке для префиксных кодов H(X)≤L<H(X)+1.
H(X)\le L < H(X)+1. H(X)≤L<H(X)+1.
- Если вероятности являются степенями 1/21/21/2 (диадические), то можно достичь L=H(X)L=H(X)L=H(X) с целочисленными длинами кода. В нашем случае распределение диадическое, поэтому оптимальный префиксный код даёт именно среднюю длину 1.51.51.5 бита/символ. Пример оптимального кода (например, Huffman): - Символы: A с p=0.5p=0.5p=0.5, B с p=0.25p=0.25p=0.25, C с p=0.25p=0.25p=0.25. - Один корректный оптимальный префиксный код: A → 0, B → 10, C → 11. Средняя длина L=0.5⋅1+0.25⋅2+0.25⋅2=1.5 бит/символ=H(X).
L=0.5\cdot 1 + 0.25\cdot 2 + 0.25\cdot 2 = 1.5\ \text{бит/символ}=H(X). L=0.5⋅1+0.25⋅2+0.25⋅2=1.5бит/символ=H(X). Простой псевдокод (Python-подобный) для кодирования/декодирования: Кодировщик: ``` code = {'A': '0', 'B': '10', 'C': '11'} function encode(symbols): bits = "" for s in symbols: bits += code[s] return bits ``` Декодировщик (жадное префиксное чтение): ``` inverse = {'0':'A', '10':'B', '11':'C'} function decode(bits): out = [] i = 0 while i < len(bits): # пробуем 1 бит, затем 2 бита (так как максимальная длина = 2) if bits[i:i+1] in inverse: out.append(inverse[bits[i:i+1]]) i += 1 else: out.append(inverse[bits[i:i+2]]) i += 2 return out ``` Заключение: энтропия даёт фундаментальную нижнюю границу средней длины кода; для данного распределения можно достичь этой границы простым префиксным кодом.
Пусть p={0.5,0.25,0.25}p=\{0.5,0.25,0.25\}p={0.5,0.25,0.25}. Энтропия Шеннона определяется как
H(X)=−∑ipilog2pi. H(X)=-\sum_i p_i\log_2 p_i.
H(X)=−i∑ pi log2 pi . Подставляя значения,
H(X)=−(0.5log20.5+0.25log20.25+0.25log20.25). H(X)=-\big(0.5\log_2 0.5 + 0.25\log_2 0.25 + 0.25\log_2 0.25\big).
H(X)=−(0.5log2 0.5+0.25log2 0.25+0.25log2 0.25). Так как log20.5=−1\log_2 0.5=-1log2 0.5=−1 и log20.25=−2\log_2 0.25=-2log2 0.25=−2,
0.5log20.5=−0.5,0.25log20.25=−0.5, 0.5\log_2 0.5=-0.5,\quad 0.25\log_2 0.25=-0.5,
0.5log2 0.5=−0.5,0.25log2 0.25=−0.5, и
H(X)=−(−0.5−0.5−0.5)=1.5 бит/символ. H(X)=-(-0.5-0.5-0.5)=1.5\ \text{бит/символ}.
H(X)=−(−0.5−0.5−0.5)=1.5 бит/символ.
Интерпретация и связь с сжатием:
- Энтропия H(X)=1.5H(X)=1.5H(X)=1.5 бита — это средняя минимальная неопределённость (количество информации) о символе источника в битах.
- Для безошибочного (без потерь) кодирования средняя длина кода на символ LLL удовлетворяет оценке для префиксных кодов
H(X)≤L<H(X)+1. H(X)\le L < H(X)+1.
H(X)≤L<H(X)+1. - Если вероятности являются степенями 1/21/21/2 (диадические), то можно достичь L=H(X)L=H(X)L=H(X) с целочисленными длинами кода. В нашем случае распределение диадическое, поэтому оптимальный префиксный код даёт именно среднюю длину 1.51.51.5 бита/символ.
Пример оптимального кода (например, Huffman):
- Символы: A с p=0.5p=0.5p=0.5, B с p=0.25p=0.25p=0.25, C с p=0.25p=0.25p=0.25.
- Один корректный оптимальный префиксный код: A → 0, B → 10, C → 11.
Средняя длина
L=0.5⋅1+0.25⋅2+0.25⋅2=1.5 бит/символ=H(X). L=0.5\cdot 1 + 0.25\cdot 2 + 0.25\cdot 2 = 1.5\ \text{бит/символ}=H(X).
L=0.5⋅1+0.25⋅2+0.25⋅2=1.5 бит/символ=H(X).
Простой псевдокод (Python-подобный) для кодирования/декодирования:
Кодировщик:
```
code = {'A': '0', 'B': '10', 'C': '11'}
function encode(symbols):
bits = ""
for s in symbols:
bits += code[s]
return bits
```
Декодировщик (жадное префиксное чтение):
```
inverse = {'0':'A', '10':'B', '11':'C'}
function decode(bits):
out = []
i = 0
while i < len(bits):
# пробуем 1 бит, затем 2 бита (так как максимальная длина = 2)
if bits[i:i+1] in inverse:
out.append(inverse[bits[i:i+1]])
i += 1
else:
out.append(inverse[bits[i:i+2]])
i += 2
return out
```
Заключение: энтропия даёт фундаментальную нижнюю границу средней длины кода; для данного распределения можно достичь этой границы простым префиксным кодом.