moj-2024/wyk/04_Entropia.ipynb

19 lines
48 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![Logo 1](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech1.jpg)\n",
"<div class=\"alert alert-block alert-info\">\n",
"<h1> Modelowanie języka</h1>\n",
"<h2> 04. <i>Entropia</i> [wykład]</h2> \n",
"<h3> Filip Graliński (2022)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)\n",
"\n"
]
},
{"cell_type":"markdown","metadata":{},"source":["## Entropia\n\n"]},{"cell_type":"markdown","metadata":{},"source":["**Entropia** ($E$) to miara nieuporządkowania, niepewności, niewiedzy. Im\nwiększa entropia, tym mniej wiemy. Pojęcie to pierwotnie wywodzi się z\ntermodynamiki, później znaleziono wiele zaskakujących analogii i zastosowań w\ninnych dyscyplinach nauki.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Entropia w fizyce\n\n"]},{"cell_type":"markdown","metadata":{},"source":["W termodynamice entropia jest miarą nieuporządkowania układów\nfizycznych, na przykład pojemników z gazem. Przykładowo, wyobraźmy\nsobie dwa pojemniki z gazem, w którym panuje różne temperatury.\n\n![img](./04_Entropia/gas-low-entropy.drawio.png)\n\nJeśli usuniemy przegrodę między pojemnikami, temperatura się wyrówna,\na uporządkowanie się zmniejszy.\n\n![img](./04_Entropia/gas-high-entropy.drawio.png)\n\nInnymi słowy, zwiększy się stopień nieuporządkowania układu, czyli właśnie entropia.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### II prawo termodynamiki\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Jedno z najbardziej fundamentalnych praw fizyki, II prawo\ntermodynamiki głosi, że w układzie zamkniętym entropia nie spada.\n\n****Pytanie****: Czy to, że napisałem te materiały do wykładu i\n*uporządkowałem* wiedzę odnośnie do statystycznych własności języka, nie\njest sprzeczne z II prawem termodynamiki?\n\nKonsekwencją II prawa termodynamiki jest śmierć cieplna Wszechświata\n(zob. [wizualizacja przyszłości Wszechświata]([https://www.youtube.com/watch?v=uD4izuDMUQA](https://www.youtube.com/watch?v=uD4izuDMUQA))).\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Entropia w teorii informacji\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Pojęcie entropii zostało „odkryte” na nowo przez Claude'a Shannona,\ngdy wypracował ogólną teorię informacji.\n\nTeoria informacji zajmuje się między innymi zagadnieniem optymalnego kodowania komunikatów.\n\nWyobraźmy sobie pewne źródło (generator) losowych komunikatów z\nzamkniętego zbioru symboli ($\\Sigma$; nieprzypadkowo używamy oznaczeń\nz poprzedniego wykładu). Nadawca $N$ chce przesłać komunikat o wyniku\nlosowania do odbiorcy $O$ używając zer i jedynek (bitów).\nTeorioinformacyjną entropię można zdefiniować jako średnią liczbę\nbitów wymaganych do przesłania komunikatu.\n\n![img](./04_Entropia/communication.drawio.png)\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Obliczanie entropii — proste przykłady\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Załóżmy, że nadawca chce przekazać odbiorcy informację o wyniku rzutu monetą.\nEntropia wynosi wówczas rzecz jasna 1 — na jedno losowanie wystarczy jeden bit\n(informację o tym, że wypadł orzeł, możemy zakodować na przykład za pomocą zera,\nzaś to, że wypadła reszka — za pomocą jedynki).\n\nRozpatrzmy przypadek, gdy nadawca rzuca ośmiościenną kością. Aby przekazać\nwynik, potrzebuje wówczas 3 bity (a więc entropia ośmiościennej kości\nwynosi 3 bity). Przykładowe kodowanie może mieć następującą postać:\n\n| Wynik|Kodowanie|\n|---|---|\n| 1|001|\n| 2|010|\n| 3|011|\n| 4|100|\n| 5|101|\n| 6|110|\n| 7|111|\n| 8|000|\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Obliczenie entropii — trudniejszy przykład\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Załóżmy, że $\\Sigma = \\{A, B, C, D\\}$, natomiast poszczególne komunikaty\nsą losowane zgodnie z następującym rozkładem prawdopodobieństwa:\n$P(A)=1/2$, $P(B)=1/4$, $P(C)=1/8$, $P(D)=1/8$. Ile wynosi entropia w\ntakim przypadku? Można by sądzić, że 2, skoro wystarczą 2 bity do\nprzekazania wyniku losowania przy zastosowaniu następującego kodowania:\n\n| Wynik|Kodowanie|\n|---|---|\n| A|00|\n| B|01|\n| C|10|\n| D|11|\n\nProblem w tym, że w rzeczywistości nie jest to *optymalne* kodowanie.\nMożemy sprytnie zmniejszyć średnią liczbę bitów wymaganych do\nprzekazania losowego wyniku przypisując częstszym wynikom krótsze\nkody, rzadszym zaś — dłuższe. Oto takie optymalne kodowanie:\n\n| Wynik|Kodowanie|\n|---|---|\n| A|0|\n| B|10|\n| C|110|\n| D|111|\n\nUżywając takiego kodowanie średnio potrzebujemy:\n\n$$\\frac{1}{2}1 + \\frac{1}{4}2 + \\frac{1}{8}3 + \\frac{1}{8}3 = 1,75$$\n\nbita. Innymi słowy, entropia takiego źródła wynosi 1,75 bita.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Kodowanie musi być jednoznaczne!\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Można by sądzić, że da się stworzyć jeszcze krótsze kodowanie dla omawianego rozkładu nierównomiernego:\n\n| Wynik|Kodowanie|\n|---|---|\n| A|0|\n| B|1|\n| C|01|\n| D|11|\n\nNiestety, nie jest to właściwe rozwiązanie — kodowanie musi być\njednoznaczne nie tylko dla pojedynczego komunikatu, lecz dla całej sekwencji.\nNa przykład ciąg 0111 nie jest jednoznaczny przy tym kodowaniu (ABBB czy CD?).\nPodane wcześniej kodowanie spełnia warunek jednoznaczności, ciąg 0111 można odkodować tylko\njako AD.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Ogólny wzór na entropię.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Na podstawie poprzedniego przykładu można dojść do intuicyjnego wniosku, że\noptymalny kod dla wyniku o prawdopodobieństwie $p$ ma długość $-\\log_2(p)$, a zatem ogólnie\nentropia źródła o rozkładzie prawdopodobieństwa $\\{p_1,\\ldots,p_|\\Sigma|\\}$ wynosi:\n\n$$E = -\\sum_{i=1}^{|\\Sigma|} p_i\\log_2(p_i)$$.\n\nZauważmy, że jest to jeden z nielicznych przypadków, gdy w nauce naturalną\npodstawą logarytmu jest 2 zamiast… podstawy logarytmu naturalnego ($e$).\n\nTeoretycznie można mierzyć entropię używając logarytmu naturalnego\n($\\ln$), jednostką entropii będzie wówczas **nat** zamiast bita,\nniewiele to jednak zmienia i jest mniej poręczne i trudniejsze do interpretacji\n(przynajmniej w kontekście informatyki) niż operowanie na bitach.\n\n****Pytanie**** Ile wynosi entropia zwykłej sześciennej kostki? Jak wygląda\noptymalne kodowanie wyników rzutu taką kostką?\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Entropia dla próby Bernoulliego\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Wiemy już, że entropia dla rzutu monetą wynosi 1 bit. A jaki będzie wynik dla źle wyważonej monety?\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"data":{"image/png":"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","text/plain":"<matplotlib.figure.Figure>"},"metadata":{},"output_type":"display_data"}],"source":["import matplotlib.pyplot as plt\nfrom math import log\nimport numpy as np\n\ndef binomial_entropy(p):\n return -(p * log(p, 2) + (1-p) * log(1-p, 2))\n\nx = list(np.arange(0.001,1,0.001))\ny = [binomial_entropy(x) for x in x]\nplt.figure().clear()\nplt.xlabel('prawdopodobieństwo wylosowania orła')\nplt.ylabel('entropia')\nplt.plot(x, y)\n\nfname = f'04_Entropia/binomial-entropy.png'\n\nplt.savefig(fname)\n\nfname"]},{"cell_type":"markdown","metadata":{},"source":["**Pytanie** Dla oszukańczej monety (np. dla której wypada zawsze orzeł) entropia\nwynosi 0, czy to wynik zgodny z intuicją?\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Entropia a język\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Tekst w danym języku możemy traktować jako ciąg symboli (komunikatów) losowanych według jakiegoś\nrozkładu prawdopodobieństwa. W tym sensie możemy mówić o entropii języka.\n\nOczywiście, jak zawsze, musimy jasno stwierdzić, czym są symbole\njęzyka: literami, wyrazami czy jeszcze jakimiś innymi jednostkami.\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Pomiar entropii języka — pierwsze przybliżenie\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Załóżmy, że chcemy zmierzyć entropię języka polskiego na przykładzie\n„Pana Tadeusza” — na poziomie znaków. W pierwszym przybliżeniu można\nby policzyć liczbę wszystkich znaków…\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"['K', 's', 'i', 'ę', 'g', 'a', ' ', 'p', 'i', 'e', 'r', 'w', 's', 'z', 'a', '\\r', '\\n', '\\r', '\\n', '\\r', '\\n', '\\r', '\\n', 'G', 'o', 's', 'p', 'o', 'd', 'a', 'r', 's', 't', 'w', 'o', '\\r', '\\n', '\\r', '\\n', 'P', 'o', 'w', 'r', 'ó', 't', ' ', 'p', 'a', 'n', 'i']"}],"source":["import requests\nfrom itertools import islice\n\nurl = 'https://wolnelektury.pl/media/book/txt/pan-tadeusz.txt'\npan_tadeusz = requests.get(url).content.decode('utf-8')\n\ndef get_characters(t):\n yield from t\n\nlist(islice(get_characters(pan_tadeusz), 100, 150))"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"95"}],"source":["chars_in_pan_tadeusz = len(set(get_characters(pan_tadeusz)))\nchars_in_pan_tadeusz"]},{"cell_type":"markdown","metadata":{},"source":["… założyć jednostajny rozkład prawdopodobieństwa i w ten sposób policzyć entropię:\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"6.569855608330948"}],"source":["from math import log\n\n95 * (1/95) * log(95, 2)"]},{"cell_type":"markdown","metadata":{},"source":["#### Mniej rozrzutne kodowanie\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Przypomnijmy sobie jednak, że rozkład jednostek języka jest zawsze\nskrajnie nierównomierny! Jeśli uwzględnić ten nierównomierny rozkład\nznaków, można opracować o wiele efektywniejszy sposób zakodowania znaków składających się na „Pana Tadeusza”\n(częste litery, np. „a” i „e” powinny mieć krótkie kody, a rzadkie, np. „ź” — dłuższe).\n\nPoliczmy entropię przy takim założeniu:\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"4.938605272823633"}],"source":["from collections import Counter\nfrom math import log\n\ndef unigram_entropy(t):\n counter = Counter(t)\n\n total = counter.total()\n return -sum((p := count / total) * log(p, 2) for count in counter.values())\n\nunigram_entropy(get_characters(pan_tadeusz))"]},{"cell_type":"markdown","metadata":{},"source":["(Jak dowiemy się na kolejnym wykładzie, zastosowaliśmy tutaj **unigramowy model języka**).\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Ile wynosi entropia rękopisu Wojnicza?\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"9 OR 9FAM ZO8 QOAR9 Q*R 8ARAM 29 [O82*]OM OPCC9 OP"}],"source":["import requests\nimport re\n\nvoynich_url = 'http://www.voynich.net/reeds/gillogly/voynich.now'\nvoynich = requests.get(voynich_url).content.decode('utf-8')\n\nvoynich = re.sub(r'\\{[^\\}]+\\}|^<[^>]+>|[-# ]+', '', voynich, flags=re.MULTILINE)\n\nvoynich = voynich.replace('\\n\\n', '#')\nvoynich = voynich.replace('\\n', ' ')\nvoynich = voynich.replace('#', '\\n')\n\nvoynich = voynich.replace('.', ' ')\n\nvoynich[100:150]"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"3.902708104423842"}],"source":["unigram_entropy(get_characters(voynich))"]},{"cell_type":"markdown","metadata":{},"source":["#### Rzeczywista entropia?\n\n"]},{"cell_type":"markdown","metadata":{},"source":["W rzeczywistości entropia jest jeszcze mniejsza, tekst nie jest\ngenerowany przecież według rozkładu wielomianowego. Istnieją rzecz\njasna pewne zależności między znakami, np. niemożliwe, żeby po „ń”\nwystąpiły litera „a” czy „e”. Na poziomie wyrazów zależności mogę mieć\njeszcze bardziej skrajny charakter, np. po wyrazie „przede” prawie na\npewno wystąpi „wszystkim”, co oznacza, że w takiej sytuacji słowo\n„wszystkim” może zostać zakodowane za pomocą 0 (!) bitów.\n\nMożna uwzględnić takie zależności i uzyskać jeszcze lepsze kodowanie,\na co za tym idzie lepsze oszacowanie entropii. (Jak wkrótce się\ndowiemy, oznacza to użycie digramowego, trigramowego, etc. modelu języka).\n\n"]},{"cell_type":"markdown","metadata":{},"source":["#### Rozmiar skompresowanego pliku jako przybliżenie entropii\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Celem algorytmów kompresji jest właściwie wyznaczanie efektywnych\nsposobów kodowania danych. Możemy więc użyć rozmiaru skompresowanego pliku w bitach\n(po podzieleniu przez oryginalną długość) jako dobrego przybliżenia entropii.\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"3.673019884633768"}],"source":["import zlib\n\ndef entropy_by_compression(t):\n compressed = zlib.compress(t.encode('utf-8'))\n return 8 * len(compressed) / len(t)\n\nentropy_by_compression(pan_tadeusz)"]},{"cell_type":"markdown","metadata":{},"source":["Dla porównania wynik dla rękopisu Wojnicza:\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":"2.942372881355932"}],"source":["entropy_by_compression(voynich)"]},{"cell_type":"markdown","metadata":{},"source":["#### Gra Shannona\n\n"]},{"cell_type":"markdown","metadata":{},"source":["Innym sposobem oszacowania entropii tekstu jest użycie… ludzi. Można poprosić rodzimych użytkowników\ndanego języka o przewidywanie kolejnych liter (bądź wyrazów) i w ten sposób oszacować entropię.\n\n**Projekt** Zaimplementuj aplikację webową, która umożliwi „rozegranie” gry Shannona.\n\n"]}],"metadata":{"org":null,"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.5.2"}},"nbformat":4,"nbformat_minor":0}