You are on page 1of 7

Міністерство освіти і науки України

Національний технічний університет України


«Київський політехнічний інститут»
Навчально-науковий комплекс
«Інститут прикладного системного аналізу»
Кафедра системного проектування

Лабораторна робота № 1
з курсу «Теорії інформації кодування»
на тему «Визначення кількості інформації
в дискретних повідомленнях»

Виконала студентка
Групи ДА-02
Лесечко О.Р

Київ 2022
Мета роботи: Засвоїти основні відомості з методів вимірювання
обсягу інформації. Отримати навички оцінювання збитковості
інформації та засобів її подолання.

Хід роботи
Завдання 1
Пункт 1. Визначити статистичні характеристики повідомлення , яке
складається з вашого ФІО: вірогідності символів, побудувати
гістограму вірогідностей.

Lesechko Olesia Romanivna

Кількість P[i]

a 3 0,12 0,3670672427

c 1 0,04 0,1857542476

e 3 0,12 0,3670672427

h 1 0,04 0,1857542476

i 2 0,08 0,2915084952

k 1 0,04 0,1857542476

L 1 0,04 0,1857542476

l 1 0,04 0,1857542476

m 1 0,04 0,1857542476

n 2 0,08 0,2915084952

O 1 0,04 0,1857542476

o 2 0,08 0,2915084952

R 1 0,04 0,1857542476

s 2 0,08 0,2915084952

v 1 0,04 0,1857542476

space 2 0,08 0,2915084952

25 1 3,86346519
Пункт 2. Розрахувати ентропію повідомлення.

Формула розрахунку ентропії:

де - вірогідність символу алфавіту з номером і (відмінна від 0), N –


розмір алфавіту.

Lesechko Olesia Romanivna


P = 3,86346519 біт.

Пункт 3. Розрахувати оптимальну кількість біт на одиницю


інформації в повідомленні та розмір повідомлення стиснутого за
оптимальним алгоритмом.
Р0 = 4 біт - оптимальна кількість біт на одиницю інформації в
повідомленні;
І0 = Р0 * N = 4 * 25 = 100 біт, - розмір повідомлення стиснутого за
оптимальним алгоритмам.
Завдання 2
from math import log2 as log2

while True:

string = input('Введіть інформацію: ')

array = {}

for s in string:

try:

array[s] += 1

except:

array[s] = 1

size = len(string)

sum = 0

for n in array.values():

sum += n/size*log2(n/size)

print('Eнтропія = ',-sum)

print('Кількість інформації = ', log2(size))

print(size)

Результати програми:

Як бачимо, дані збігаються.


Програма для файлів різного розміру та різними мовами:

from math import log2 as log


import pandas as pd
import itertools

ALPHABET_SIZE = 1 << 8
FILES = ['1', '10', '15']
LANGUAGES = ['r', 'u', 'e']

def get_information_amount(text: str) -> float:


return len(text) * log(ALPHABET_SIZE)

def get_freq_dict(text: str):


char_count: dict[str, int] = {}
for char in text:
char_count[char] = char_count.get(char, 0) + 1

return {
char: count / len(text)
for char, count in char_count.items()
}

def get_entropy(text: str) -> float:


return -sum(freq * log(freq) for freq in get_freq_dict(text).values())

def stats_mode_handler():
stats = {}
for size, lang in itertools.product(FILES, LANGUAGES):
with open(f'{lang}{size}.txt', 'rb') as f:
text = f.read()

stats[size] = {
**stats.get(size, {}),
**{ lang: get_entropy(text) }
}
print(pd.DataFrame(stats).to_string())

def print_text_stats(text: str):


print(f'The amount of information is {get_information_amount(text)}')
print(f'Entropy is {get_entropy(text)}')

def file_mode_handler():
filename = input('Enter file name:\n')

with open(filename, 'rb') as f:


text = f.read()
print_text_stats(text)

def input_mode_handler():
text = input('Enter your text:\n')
print_text_stats(text)

mode: str = input('File mode? [f/i/s] ').lower()


mode = mode if mode in {'f', 'i', 's'} else 's'

if mode == 'i':
input_mode_handler()
elif mode == 'f':
file_mode_handler()
elif mode == 's':
stats_mode_handler()

Результат роботи програми:

Висновок:
Засвоїла основні відомості з методів вимірювання обсягу
інформації. Отримала навички оцінювання збитковості інформації та
засобів її подолання.

Виходячи з відповідності результатів реальним числам, можливо


зробити висновок, що створена в процесі виконання лабораторної
роботи програма об’єктивно аналізує файл, визначає його ентропію
відповідно до ефективності статистичного архівування, а також
вірно визначає відносну частоту входження символів в файл.

You might also like