Jediná informace, kterou na začátku rozpoznávání máme, je délka značky (tj. doba po kterou byl vysílací klíč v poloze zapnuto) udávaná v milisekundách. Příznak tedy bude jen jeden, označíme jej x, a bude jím délka značky ve stovkách milisekund.
Před vlastní klasifikací je třeba klasifikátor natrénovat. Známe apriorní pravděpodobnosti výskytu značek "tečka" a "čárka" v českém textu - převedli jsme do Morseovy abecedy povídku "Těžko pojmenovatelný příběh" od studentky Masarykova gymnázia v Plzni Kateřiny Baxové a zjistili, že teček je v textu 55% a čárek 45% (Poměr 55:45 je v českém textu běžný, jak jsme ověřili i na mnohých jiných textech.). To je samo o sobě zajímavé, protože Morse svoji abecedu původně navrhl tak, aby poměr teček a čárek ve vysílané zprávě byl 1:1. Nepoměr, který jsme experimentálně zjistili, je přirozeně způsoben tím, že frekvence výskytu písmen v českém textu je jiná než v anglickém, pro který byla Morseova abeceda navržena.
Cílem trénování je zjistit hustoty pravděpodobností p(x|1) a p(x|2), kde x je hodnota příznaku, je identifikátor třídy "tečka" a 2 je identifikátor třídy "čárka". Tyto hustoty pravděpodobností reprezentují rozložení délek značek v jednotlivých třídách a budeme je potřebovat pro výpočet aposteriorních pravděpodobností.
Klasifikátor budeme trénovat opakovaným vysíláním signálu "SOS", tedy posloupnosti značek "...---...". Relativní četnosti výskytu příznaků x pro nás budou dobrým odhadem hustoty pravděpodobnosti. Zároveň získáme hustotu pravděpodobnosti p(x). Máme tak k dispozici všechny potřebné hodnoty pro výpočet aposteriorních pravděpodobností podle Bayesova vztahu. Vypočtené hodnoty uložíme do tabulky.
Vlastní zařazení do třídy je už poměrně jednoduché. Z tabulky, kde uchováváme hodnoty aposteriorních pravděpodobností, zjistíme hodnoty P(1|x) a P(2|x) a značku zařadíme do té třídy, která má tuto aposteriorní pravděpodobnost větší.
Nyní se zaměříme na programovou realizaci úlohy rozpoznávání Morseovy abecedy. Projekt jsme nazvali Morse a stejně jako příklad na rozpoznávání segmentových číslic, jsme jej naprogramovali v jazyce Java. Používali jsme i stejné vývojové prostředí (Java WorkShop 2.0) a překladač (JDK 1.1.3). Opět jsme využívali knihovny AWT, třídu ImageButton a Tracker, jak je také popsáno na stránce o segmentových číslicích.
Vytvořili jsme osm tříd, každá je definována v samostatném souboru. Zde je jejich výčet s krátkým popisem významu třídy.
Všechny zdrojové texty programu jsou umístěny v adresáři Morse. Spolu s nimi jsou v tomto adresáři i přeložené třídy (soubory s příponou .class) a podadresáře img a sound s obrázky a zvukovými klipy.
Při trénování je uživatel nejprve vyzván, aby několikrát stiskl tlačítko (budeme mu říkat KLÍČ), a to třikrát krátce, třikrát dlouze a opět třikrát krátce (SOS). Tím získáme důležitá data, a to sice četnosti výskytů hodnot příznaků objektů se známým zařazením do třídy. Víme totiž, že první a poslední trojice značek patří do třídy 1 - tečka a prostřední trojice do třídy 2 - čárka.
Při každém uvolnění klíče se provede část kódu, která zajistí zaznamenání četností výskytu příznaků do pole. Toto pole je dvourozměrné. Prvním indexem určujeme třídu, ke které se četnosti vztahují. Druhý index odpovídá příznaku, tedy délce značky ve stovkách milisekund. Všechny četnosti, pravděpodobnosti a hustoty pravděpodobností uchováváme jako pole o deseti prvcích, kde každý z prvků pole odpovídá stomilisekundovému úseku.
Z četností naměřených při trénování a z apriorních pravděpodobností snadno určíme aposteriorní pravděpodobnosti. Nejprve je třeba přepočítat četnosti N(x|i) na hustoty pravděpodobnosti p(x|i) a p(x). Tím získáme všechna potřebná data pro výpočet pravděpodobností P(1|x) a P(2|x) podle Bayesova vztahu.
Nyní se podívejme na proces klasifikace. Jak víme, klasifikace spočívá v nalezení maxima z pravděpodobností P(i|x). Nám postačí, zjistíme-li, která z funkcí P(1|x) a P(2|x) má pro klasifikovaný objekt s příznakem x větší hodnotu. Do té zařadíme klasifikovaný objekt.
Cílem realizace příkladu na rozpoznávání Morseovy abecedy bylo předvést, jakým způsobem se Bayesův klasifikátor implementuje. Důraz byl kladen především na "průhlednost" implementace, aby byl program co nejsnáze pochopitelný a mohl sloužit jako jakýsi vzor, podle kterého lze bez problémů napsat i jiný podobný klasifikátor.
Ukažme si nyní slabé místo programu. Pokud klasifikujeme značku, jejíž příznak má hodnotu, která se při trénování nevyskytla ani v jedné ze tříd, jsou aposteriorní pravděpodobnosti obou tříd stejné (obě jsou 0%) a neumíme rozhodnout, do které třídy značku zařadit. To se stává zejména u vyšších hodnot příznaků. Máme ověřeno, že při trénování uživatelé trénovací množinou obvykle nepokryjí celý příznakový prostor, tj. některé z deseti intervalů mají nulovou četnost. Obvykle jsou to ty, které odpovídají delším časovým úsekům.
Naskýtá se otázka, jak tomuto nepříjemnému efektu zamezit. V zásadě lze použít dva přístupy:
Ani jedno z výše uvedených vylepšení algoritmu jsme do konečné verze programu nezařadili. Řešení ad 1) jsme nepoužili proto, že by se až dosud velmi jednoduchý způsob řešení příliš zkomplikoval. To by porušilo zásadu jednoduchosti, kterou pro tento výukový program vyžadujeme. Řešení ad 2) jsme zavrhli ze stejného důvodu. Navíc nám vadila i jeho nesystematičnost. Myslíme si, že bude přínosnější, když si všimnete nedostatků metody (a budete s nimi počítat při návrhu vlastních klasifikátorů).
Applet se spouští automaticky po zobrazení HTML stránky, na které je umístěn. K řízení běhu programu slouží čtveřice záložek umístěných v levé části plochy appletu (viz obr.).
V režimu "trénování" se od uživatele očekává, že rozšíří trénovací množinu vysláním signálu SOS na tlačítku "KLÍČ". K ovládání trénovacího procesu slouží tlačítka "zpět", "záznam" a "přehraj", která mají stejnou funkci jako tlačítka na magnetofonu. Postup, jakým se trénuje, je popsán přímo na stránce s appletem - viz obr.
Pokud si uživatel přeje současné natrénování zrušit a natrénovat klasifikátor znovu podle svého, stiskne tlačítko "Nové trénování". Aby mohl klasifikátor pracovat s určitou spolehlivostí, je třeba natrénovat ho alespoň pětkrát (tj. pětkrát vyslat signál SOS). Samozřejmě platí, že čím vícekrát je klasifikátor natrénován, tím kvalitněji bude rozpoznávat.
V režimu "klasifikace" se od uživatele očekává, že prostřednictvím tlačítka "KLÍČ" vyšle písmeno Morseovy abecedy. Při vysílání se průběžně zobrazuje, jak klasifikátor rozpoznává jednotlivé značky a jaké písmeno abecedy odpovídá dosud rozpoznané posloupnosti značek - viz obrázek.
Applet není třeba instalovat, pokud je spuštěn z výukového programu. Chceme-li applet spustit samostatně, přepneme se do adresáře Morse a otevřeme soubor Morse.html v Java-kompatibilním WWW prohlížeči.
Pro spuštění applet vyžaduje stejné podmínky jako applet Digits tj. Microsoft Internet Explorer 4.0, Netscape Navigator 4.5 nebo HotJava 1.0, popř. Java Applet Viewer.