Ultimátní průvodce na přijímačky

Umělá inteligence a data science · FIS VŠE
10 okruhů Jednoduše vysvětleno Řešené příklady Vzorový test ke konci Cíl: 60 %+

👋 Jak se z tohohle učit (čti dřív, než začneš)

Okruh 1

Algoritmy a výpočetní složitost

Logika, co je algoritmus, jak ho zapsat, a jak rychle běží (Big-O). Plus binární vyhledávací strom.

🧠 Základy matematické logiky

Logika pracuje s tvrzeními, která jsou buď pravdivá (1) nebo nepravdivá (0). Spojuje je pomocí operátorů:

OperátorVýznamJe pravda, když…
AND (∧, „a zároveň“)konjunkceobě části jsou pravda
OR (∨, „nebo“)disjunkceaspoň jedna část je pravda
NOT (¬, „není“)negaceobrátí pravdu na nepravdu a naopak
(implikace, „když…, tak…“)implikacenepravda jen když je vlevo pravda a vpravo nepravda
Zapamatuj

AND je „přísné“ (musí platit všechno), OR je „benevolentní“ (stačí jedno). Implikace A → B je nepravdivá jen v jednom případě: A platí, ale B ne.

📋 Co je algoritmus

Algoritmus = přesný, konečný návod (posloupnost kroků), jak z vstupu spočítat výstup. Jako recept.

Správný algoritmus má tyto vlastnosti:

  • Konečnost – jednou skončí (nesmí běžet do nekonečna).
  • Determinovanost – v každém kroku je jasné, co dělat dál.
  • Hromadnost – funguje pro celou třídu vstupů, ne jen pro jeden.
  • Vstup a výstup – něco dostane, něco vrátí.

Tři základní stavební kameny (algoritmické konstrukce)

  • Sekvence – kroky jdou po sobě.
  • Větvení / podmínkaif … else … (rozhodnutí).
  • Cyklusfor, while (opakování).

Zapsat se dá slovně, vývojovým diagramem, pseudokódem nebo přímo v programovacím jazyce.

Algoritmicky neřešitelné problémy

Některé problémy nelze vyřešit žádným algoritmem. Nejznámější je problém zastavení (halting problem): neexistuje program, který by pro libovolný jiný program dopředu spolehlivě řekl, zda se zastaví, nebo poběží navždy.

⏱️ Výpočetní složitost (Big-O)

Časová složitost říká, jak rychle roste počet kroků algoritmu, když roste velikost vstupu n. Zapisuje se jako O(...) – „nejtěsnější horní odhad v nejhorším případě“.

SložitostNázevTypický příklad
O(1)konstantnípřístup do pole podle indexu
O(log n)logaritmickábinární vyhledávání, hledání v BST
O(n)lineárníprojít celé pole jedním cyklem
O(n log n)kvazilineárnírychlé řadicí algoritmy (merge sort)
O(n²)kvadratickádva vnořené cykly přes pole
Trik na rozpoznání

Spočítej vnořené cykly přes data: jeden cyklus přes n = O(n), dva do sebe vnořené = O(n²). Pozor ale na return uvnitř – ten může cyklus předčasně ukončit a složitost srazit dolů (viz řešený příklad níže).

🌳 Binární vyhledávací strom (BST)

Binární strom = každý uzel má max. dva potomky (levý, pravý). U vyhledávacího (BST) navíc platí pravidlo:

Vlevo menší, vpravo větší. Levý potomek < rodič < pravý potomek.

Díky tomu při hledání/vkládání jdeme od kořene a v každém uzlu se rozhodneme vlevo/vpravo – nikdy nemusíme procházet celý strom.

  • Kořen = úplně horní uzel. List = uzel bez potomků.
  • Výška stromu = počet hran nejdelší cesty z kořene do nejvzdálenějšího listu. (Pozor: hran, ne uzlů!)
  • Vkládání: jdeme od kořene, porovnáváme. Menší → doleva, větší → doprava. Když narazíme na prázdné místo, tam vložíme.

Řešený příklad 1 – Výška stromu po vložení

Výchozí strom:

        9
      /   \
     4     16
    / \      \
   1   8      18

Provedeme insert(root, 17) a insert(root, 20).

Vkládáme 17: 17 > 9 → doprava k 16. 17 > 16 → doprava k 18. 17 < 18 → doleva. → 17 je levý potomek 18.

Vkládáme 20: 20 > 9 → 16. 20 > 16 → 18. 20 > 18 → doprava. → 20 je pravý potomek 18.

        9
      /   \
     4     16
    / \      \
   1   8      18
             /  \
           17    20

Nejdelší cesta: 9 → 16 → 18 → 17 = 3 hrany.

Odpověď: C – výška je 3

Řešený příklad 2 – Složitost funkce

def func(arr, target):
    s = 0
    for i in range(len(arr)):      # cyklus přes n prvků
        if arr[i] == target:
            for j in range(i + 1): # vnitřní cyklus...
                s = s + arr[j]
            return s               # ...ale hned poté RETURN!
    return s

Na první pohled to vypadá na O(n²) (dva cykly). Ale: vnitřní cyklus se spustí jen jednou, protože hned po něm je return – funkce skončí. V nejhorším případě (target je poslední prvek) projdeme vnější cyklus n-krát a vnitřní jednou n-krát. To je n + n = O(n).

Odpověď: A – O(n)

🔣 Bikonditional, XOR, tautologie, kontradikce

Dva operátory navíc, které se v testech občas objeví:

OperátorZápisPravda, když…
Bikonditional (↔)A ↔ BA i B mají stejnou pravdivostní hodnotu (obě 1 nebo obě 0)
XOR (⊕)A ⊕ Bprávě jedna z nich je pravda (ne obě)
  • Tautologie = výrok pravdivý za všech okolností. Příklad: A ∨ ¬A (buď prší nebo neprší – vždy pravda).
  • Kontradikce = výrok vždy nepravdivý. Příklad: A ∧ ¬A (prší a zároveň neprší).
Implikace – jediná past

A → B je nepravdivá jen když A je pravda a B je lež. Ve všech ostatních kombinacích je pravdivá. Takže „Pokud je prase létavé, pak je Měsíc ze sýra" = pravda (A je lež).

📊 Vývojový diagram – symboly + rekurze

SymbolTvarPoužití
Terminátoroválný / zaoblený obdélníkStart / Konec algoritmu
Procesobdélníkvýpočet, přiřazení hodnoty
Rozhodnutíkosočtverec (diamant)podmínka Ano/Ne (větvení)
Vstup / Výstuprovnoběžníknačtení vstupu nebo výpis výsledku
Rekurze = funkce, která volá sama sebe. Musí mít základní případ (base case), kdy se zastaví – jinak by šla do nekonečna. Příklad: faktoriál n! = n × (n−1)!, kde 0! = 1.
Složitost rekurze

Rekurzivní průchod celým stromem / všemi prvky → O(n). Dělení problému na půlky (binární vyhledávání) → O(log n). Merge sort (dělení na půlky + slévání) → O(n log n).

Okruh 2

Vysvětlitelnost modelů (XAI)

Proč model rozhodl tak, jak rozhodl. White-box vs black-box, feature importance, LIME a SHAP.

🔍 White-box vs black-box

White-box (průhledný)

Sám o sobě je srozumitelný – vidíš, podle čeho rozhoduje.

  • rozhodovací stromy
  • rozhodovací pravidla (if-then)
  • lineární / logistická regrese

Black-box (neprůhledný)

Funguje dobře, ale nevidíš dovnitř – proč rozhodl, je těžké říct.

  • neuronové sítě
  • random forest (les stromů)
  • gradient boosting

XAI (Explainable AI) = nástroje a metody, které dělají i black-box modely srozumitelnými.

📊 Klíčové pojmy

Feature importance (důležitost prediktorů) – které vstupní proměnné nejvíc ovlivňují předpověď modelu. Např. „cenu bytu nejvíc určuje plocha“.
LIME – vysvětlí jednu konkrétní předpověď tak, že kolem ní postaví jednoduchý (lineární) model. „Lokální“ vysvětlení.
SHAP – přiřadí každé proměnné spravedlivý podíl na výsledku (vychází z teorie her). Říká, o kolik daná proměnná posunula předpověď nahoru/dolů.
Jednoduše

LIME i SHAP řeší stejný cíl – „proč model řekl zrovna tohle?” – ale u black-box modelů. White-box modely (strom, pravidla) jsou vysvětlitelné rovnou.

🌐 Globální vs lokální vysvětlitelnost

Globální

Popisuje chování modelu jako celku. „Co model obecně považuje za důležité?”

  • Feature importance (průměr přes všechna data)
  • PDP (Partial Dependence Plot)

Lokální

Vysvětlí jedno konkrétní rozhodnutí. „Proč takhle zařadil tento bod?”

  • LIME
  • SHAP (individuální force plot)
PDP (Partial Dependence Plot) – globální vizualizace: ukazuje, jak se průměrná předpověď mění, když měníme hodnotu jedné proměnné a ostatní průměrujeme.

🎲 SHAP – princip a interpretace

SHAP vychází z teorie kooperativních her. Každé proměnné přidělí „spravedlivý podíl” na výsledku – jako když hráčům v týmu přidělíme podíl na výhře.

  • SHAP hodnota > 0 → proměnná zvýšila předpověď (tlačí k pozitivní třídě).
  • SHAP hodnota < 0 → proměnná snížila předpověď.
  • SHAP hodnota = 0 → vliv neutrální.

Součet všech SHAP hodnot + průměrná předpověď = celková předpověď pro daný vzorek.

LIME vs SHAP – kdy co

LIME: rychlejší, lokální lineární model kolem bodu, aproximativní. SHAP: přesnější, konzistentní, ale pomalejší. Oba jsou model-agnostické – fungují s jakýmkoli black-box modelem.

Feature importance u rozhodovacích stromů = průměrné snížení nečistoty (Gini / entropie) v uzlech, kde se proměnná použila. U Random Forestu se průměruje přes všechny stromy. Čím větší, tím důležitější.
Okruh 3

Textová analytika

Jak převést text na čísla (vektory), aby s ním mohl počítač pracovat: BoW, TF-IDF, embeddings, kosinová podobnost.

🛍️ Bag of Words (BoW)

„Pytel slov“ – text převedeme na vektor, který říká, kolikrát se každé slovo vyskytlo. Pořadí slov se ignoruje.

Příklad slovník: [clovek, kouse, pes]

  • „pes kouse clovek“ → (1, 1, 1)
  • „clovek kouse pes“ → (1, 1, 1)
Důležité

Protože BoW počítá jen výskyty a ne pořadí, věty „pes kouše člověka“ a „člověk kouše psa“ mají stejný vektor, i když mají jiný význam. To je hlavní omezení BoW.

⚖️ TF-IDF a embeddings

TF-IDF

Vylepšení BoW. Slovu dá váhu podle dvou věcí:

  • TF (term frequency) – jak často je slovo v daném dokumentu (čím víc, tím důležitější).
  • IDF (inverse document frequency) – jak vzácné je napříč všemi dokumenty. Slova jako „a“, „je“ jsou všude → mají malou váhu. Vzácná slova → velkou.

Výsledek: zvýrazní slova typická pro daný dokument a potlačí běžná slova.

Embeddings (vektorová vnoření)

Moderní přístup. Slova/věty převede na vektory tak, aby podobná slova měla podobné vektory (např. „pes“ a „kočka“ blízko sebe). Na rozdíl od BoW zachycuje význam, ne jen výskyt.

📐 Kosinová podobnost

Měří, jak podobné jsou dva vektory – podle úhlu mezi nimi (ne podle délky). Hodnoty od −1 do 1; 1 = stejný směr, 0 = kolmé (nesouvisí).

Vzorec: cos(θ) = (d1 · d2) / (|d1| · |d2|)

  • d1 · d2 (skalární součin) = sečteme součiny odpovídajících složek.
  • |d| (délka/norma) = odmocnina ze součtu druhých mocnin složek.

Řešený příklad – Kosinová podobnost

d1 = (1, 1, 0),   d2 = (1, 0, 1)

Skalární součin: 1·1 + 1·0 + 0·1 = 1

Délky: |d1| = √(1+1+0) = √2,   |d2| = √(1+0+1) = √2

Dosadíme: cos(θ) = 1 / (√2 · √2) = 1 / 2 = 0,5

Odpověď: B – 0,5

🔧 Předzpracování textu (NLP pipeline)

Před převodem textu na vektor se text obvykle „vyčistí". Typický postup:

KrokCo děláPříklad
TokenizaceRozdělí text na tokeny (slova/znaky)"Pes běží" → ["Pes", "běží"]
LowercasingPřevede na malá písmena"Pes" → "pes"
Stop slovaOdstraní nejčastější bezvýznamná slova"a", "je", "the", "in"
StemmingOřízne slovo na kmen (mechanicky, hrubě)"running" → "run", "dogs" → "dog"
LemmatizacePřevede na základní slovníkový tvar"lepší" → "dobrý" (gramaticky správně)
Stemming vs lemmatizace

Stemming: rychlejší, může dát neexistující kmen. Lemmatizace: pomalejší, vrátí skutečné slovníkové slovo. Pro přesné NLP použij lemmatizaci.

🔍 Modely vyhledávání a hodnocení relevance

Vektorový model (VSM) – dokumenty i dotaz se převedou na TF-IDF vektory. Relevance = kosinová podobnost vektoru dotazu a dokumentu. Vyšší podobnost = relevantnější.
BM25 (Best Match 25) – modernější varianta TF-IDF. Lépe zachází s délkou dokumentu a „sytostí" výskytu (slovo se po určité frekvenci přestane výrazně počítat). Používá ho Elasticsearch nebo Lucene.
TF-IDF vzorec

TF(t,d) = počet výskytů t v dokumentu d / celkový počet slov v d
IDF(t) = log(N / df(t)) kde N = počet dokumentů, df(t) = počet dokumentů s t.
TF-IDF = TF × IDF → vzácná, ale v dokumentu častá slova dostanou vysokou váhu.

Okruh 4

Programovací paradigmata

Objektově orientované vs procedurální programování, datové typy a struktury, základní konstrukce.

🧩 Objektově orientované programování (OOP)

Program skládáme z objektů, které mají data (vlastnosti) i chování (metody). Čtyři pilíře:

PojemCo to jePříklad
Třídašablona / vzorclass User
Objektkonkrétní instance třídyuživatel Jan
Dědičnosttřída přebírá vlastnosti jiné třídyReader dědí z User
Polymorfismusstejná metoda se chová různě v různých třídáchtisk() jinak u faktury, jinak u dopisu
Zapouzdřenískrytí vnitřních dat (private), přístup jen přes metodynesaháš přímo na zůstatek účtu
Dědičnost – jak ji poznat

Když je User → Reader a User → Librarian, znamená to, že Reader a Librarian dědí z User (potomci přebírají vlastnosti rodiče). Ne naopak! Vztah „je druhem“: Reader je druhem User.

⚙️ OOP vs procedurální programování

Procedurální

Program = posloupnost procedur/funkcí, které pracují s daty. Data a funkce jsou oddělené.

Příklady: C, klasický Pascal.

Objektové (OOP)

Data a chování jsou pohromadě v objektech. Lépe se škáluje a udržuje u velkých aplikací.

Příklady: Java, Python, C#.

📦 Datové typy, struktury a konstrukce

Základní datové typy

  • int – celé číslo, float – desetinné, bool – pravda/nepravda, string – text.

Datové struktury

  • Pole / seznam (list) – uspořádaná řada prvků.
  • Slovník (dictionary / mapa) – dvojice klíč → hodnota.
  • Množina (set) – kolekce bez duplicit.

Základní konstrukce

  • Podmínka (if/else) – rozhodování.
  • Cyklus (for, while) – opakování. Když potřebuješ projít všechny prvky seznamu, použiješ cyklus.
  • Výjimka (exception) – ošetření chyby za běhu (try/except), aby program nespadl.

🔌 Rozhraní (Interface) a abstrakce

Abstrakce – skrytí implementačních detailů. Pracujeme jen s tím, co potřebujeme. „Neřeším, jak motor funguje – jen šlápnu na plyn."
Rozhraní (Interface) – smlouva: říká, co třída musí umět (jaké metody mít), ale ne jak. V Javě: interface Printable { void print(); }. Umožňuje polymorfismus bez přímé dědičnosti.

Abstraktní třída

Může mít i implementované metody. Třída dědí z max. jedné abstraktní třídy.

Interface

Jen deklarace metod (bez implementace). Třída může implementovat více rozhraní najednou.

📚 Další datové struktury

StrukturaPrincipSložitostPříklad použití
Zásobník (Stack)LIFO – poslední dovnitř, první ven. push / popO(1)volání funkcí, undo/redo
Fronta (Queue)FIFO – první dovnitř, první ven. enqueue / dequeueO(1)tiskový front, BFS průchod grafem
Spojový seznamUzly propojené ukazateli. Přidání O(1), hledání O(n)O(n) searchdynamicky rostoucí kolekce
Hash mapa (dict)Klíč → hash → index. Průměrně O(1) přístupO(1) avg.slovníky, cache, indexy
Pole vs spojový seznam

Pole: O(1) přístup podle indexu, ale pomalé vkládání uprostřed O(n). Spojový seznam: O(1) vkládání na začátek, ale O(n) přístup k prvku.

Okruh 5

Vývoj a testování softwaru

Metodiky, testování, návrhové a architektonické vzory, API, a hlavně správa verzí – Git.

🔄 Vývojové metodiky a testování

Vodopád (Waterfall)

Fáze jdou za sebou: analýza → návrh → implementace → testování → nasazení. Tuhé, těžko se vrací zpět.

Agilní (Agile / Scrum)

Vývoj po krátkých iteracích (sprintech), průběžné dodávky, rychlá reakce na změny.

Druhy testů

  • Jednotkové (unit) – testují malou část (funkci) izolovaně.
  • Integrační – testují, jak spolu části fungují dohromady.
  • Systémové / akceptační – testují celou aplikaci z pohledu uživatele.

🏛️ Architektonické a návrhové vzory

Architektury

  • Vícevrstvá – oddělené vrstvy (prezentace / logika / data).
  • Klient–server – klient se ptá, server odpovídá.
  • Microservices – aplikace rozdělená na malé nezávislé služby.

Návrhové vzory

  • MVC (Model-View-Controller) – odděluje data (Model), zobrazení (View) a řízení (Controller).
  • Observer – objekty se „přihlásí k odběru“ a dostanou upozornění, když se něco změní.
  • Singleton – zajistí, že existuje jen jedna jediná instance třídy (např. jedno připojení k DB).
API – rozhraní, přes které spolu programy komunikují („domluvený jazyk“, jak se ptát a co dostanu zpět).

🌿 Git – správa verzí

Git ukládá historii změn v kódu a umožňuje práci ve více lidech. Klíčové pojmy:

PojemCo dělá
commituloží snímek změn s popisem
branch (větev)samostatná linie vývoje (např. feature-export)
mergesloučí změny z jedné větve do druhé
checkoutpřepne se na jinou větev
pull / pushstáhne / nahraje změny ze/na server
feature-export → merge → main
Zapamatuj

Když chceš dostat hotovou funkci z větve feature-export do hlavní větve main, použiješ merge. Ne mazání větve, ne ruční přepisování souborů.

🚀 CI/CD a Docker

CI (Continuous Integration) – automatické sestavení a testování kódu po každém commitu. Chyby se chytí brzy.
CD (Continuous Delivery/Deployment) – automatické nasazení aplikace do produkce (nebo stagingového prostředí) po úspěšném CI.
Docker (kontejner) – izolované prostředí s aplikací a všemi závislostmi. Lehčí než virtuální stroj. Image = šablona, kontejner = běžící instance.
Pipeline

Automatizovaná sekvence kroků: build → test → dockerize → deploy. Nástroje: GitHub Actions, GitLab CI, Jenkins.

🌐 REST API a HTTP metody

REST API – webové rozhraní: každý zdroj má URL, komunikuje se přes HTTP. Bezstavové – každý požadavek obsahuje vše potřebné.
HTTP metodaOperace (CRUD)Příklad
GETRead – čtení datGET /users/1 → vrátí uživatele
POSTCreate – vytvořeníPOST /users → přidá uživatele
PUT / PATCHUpdate – aktualizacePUT /users/1 → upraví
DELETEDelete – smazáníDELETE /users/1 → smaže

HTTP stavové kódy: 200 OK · 201 Created · 400 Bad Request · 401 Unauthorized · 404 Not Found · 500 Internal Server Error.

🧪 TDD a SOLID principy

TDD (Test-Driven Development) – nejprve napíšeš test (červený), pak minimální kód (zelený), pak refaktoruješ. Cyklus: Red → Green → Refactor.

Zkratka SOLID – pět principů dobrého OOP návrhu:

  • Single Responsibility – třída dělá jednu věc.
  • Open/Closed – otevřená pro rozšíření, uzavřená pro změny.
  • Liskov Substitution – potomka lze použít místo rodiče.
  • Interface Segregation – malá rozhraní místo jednoho obřího.
  • Dependency Inversion – záviset na abstrakcích, ne konkrétních třídách.
Okruh 6

Databáze a SQL

Relační vs NoSQL, návrh databáze, vztahy (1:N, M:N), a dotazování v SQL.

🗄️ Relační vs NoSQL

Relační (SQL)

Data v tabulkách (řádky a sloupce), pevné schéma, propojení přes klíče. Dotazy v jazyce SQL.

Např. MySQL, MariaDB, Oracle, PostgreSQL.

NoSQL

Flexibilní struktura – dokumenty, klíč–hodnota, grafy. Dobré pro velká a nestrukturovaná data.

Např. MongoDB, Redis.

Strukturovaná data = tabulky (jasné sloupce). Nestrukturovaná = text, obrázky, videa.

🔗 Návrh databáze a vztahy (kardinalita)

Při návrhu kreslíme entity (tabulky) a vztahy mezi nimi. Kardinalita říká, kolik kusů se k sobě váže:

  • 1:1 – jeden ku jednomu.
  • 1:N – jeden ku mnoha (jeden zákazník má mnoho rezervací).
  • M:N – mnoho ku mnoha (jedna rezervace má více služeb a jedna služba je ve více rezervacích).
Klíčové pravidlo: jak na M:N

Vztah M:N nejde uložit přímo přidáním sloupce. Řeší se vazební (spojovací) tabulkou, která obsahuje cizí klíče na obě tabulky. (Např. tabulka loans_books propojuje výpůjčky a knihy.)

💬 SQL základy

SELECT sloupce        -- co chci vrátit
FROM tabulka          -- odkud
JOIN tabulka2 ON ...  -- propojení tabulek
WHERE podmínka        -- filtr řádků
GROUP BY sloupec      -- seskupení
ORDER BY sloupec;     -- řazení
  • JOIN spojí řádky z více tabulek podle klíče.
  • LEFT JOIN – vezme všechny řádky z levé tabulky, i když k nim vpravo nic není (např. i čtenáře s 0 výpůjčkami).
  • COUNT(...) spočítá řádky; GROUP BY seskupí (např. po čtenářích), aby COUNT počítal pro každou skupinu zvlášť.

Řešený příklad – SQL dotaz

Chceme jména a id čtenářů + počet jejich výpůjček (i ty s nulou).

SELECT readers.id, readers.name, COUNT(loans.id)
FROM readers
LEFT JOIN loans ON readers.id = loans.reader
GROUP BY readers.name, readers.id;

Proč právě tento:

  • LEFT JOIN – aby se objevili i čtenáři bez výpůjček.
  • spojení přes správný sloupec loans.reader = readers.id.
  • GROUP BY podle čtenáře, aby COUNT počítal výpůjčky pro každého zvlášť.
Odpověď: A

📐 Normalizace databáze (1NF, 2NF, 3NF)

Normalizace = návrh tabulek tak, aby se minimalizovaly redundance a anomálie při vkládání/mazání dat.

Normální formaPožadavek
1NFKaždá buňka obsahuje jen jednu atomickou hodnotu (žádné seznamy v buňce).
2NF1NF + neklíčový atribut závisí na celém primárním klíči (ne jen části složeného klíče).
3NF2NF + žádný neklíčový atribut nezávisí tranzitivně na klíči (A→B→C → B musí do vlastní tabulky).
Primární klíč vs cizí klíč

PK (Primary Key) = jednoznačně identifikuje řádek; unikátní, NOT NULL. FK (Foreign Key) = odkazuje na PK jiné tabulky → vytváří vztah a zajišťuje referenční integritu.

🔒 ACID vlastnosti transakcí

Transakce = skupina operací, která se buď celá provede, nebo vůbec. ACID zaručuje spolehlivost:

  • Atomicity – buď vše, nebo nic (převod peněz: sníží i zvýší, nebo ani jedno).
  • Consistency – DB přejde z jednoho platného stavu do druhého (integritní omezení se nikdy neporuší).
  • Isolation – souběžné transakce se navzájem neovlivní.
  • Durability – po potvrzení (COMMIT) jsou data uložena trvale i při výpadku.

💬 SQL – HAVING, poddotaz, agregace

-- HAVING = filtr PO GROUP BY (pro agregáty)
SELECT reader_id, COUNT(*) AS pocet
FROM loans
GROUP BY reader_id
HAVING COUNT(*) > 3;    -- jen čtenáři s více než 3 výpůjčkami

-- Poddotaz (subquery)
SELECT name FROM readers
WHERE id IN (SELECT reader_id FROM loans WHERE fine > 0);

-- Agregační funkce
SELECT AVG(price), SUM(price), MAX(price), MIN(price) FROM books;
WHERE vs HAVING

WHERE filtruje řádky před GROUP BY. HAVING filtruje skupiny po GROUP BY. Na agregáty (COUNT, AVG…) musíš vždy HAVING.

📄 Datové formáty: JSON, XML, CSV

JSON

Lehký, čitelný, standard pro REST API.

{"name": "Jan",
 "age": 25,
 "books": [1, 3]}

XML

Starší, rozsáhlejší, enterprise systémy, konfigurace.

<user>
  <name>Jan</name>
  <age>25</age>
</user>

CSV = tabulkový formát oddělený čárkami (import/export dat). Parquet = sloupcový binární formát pro big data (efektivní komprese).

NoSQL typy podrobněji: Dokumentové (MongoDB – JSON dokumenty) · Klíč–hodnota (Redis – cache) · Sloupcové (Cassandra) · Grafové (Neo4j – vztahy mezi entitami).

Okruh 7

Strojové učení s učitelem

Model se učí z příkladů, kde známe správnou odpověď. Perceptron, K-NN, logistická regrese, rozhodovací stromy a lesy.

🎓 Co je „s učitelem“

Učení s učitelem (supervised) = trénujeme na datech, kde u každého příkladu známe správnou odpověď (label). Model se naučí vztah vstup → výstup.
  • Klasifikace – výstupem je třída/kategorie (spam / ne-spam).
  • Regrese – výstupem je číslo (cena bytu).

📏 Perceptron a lineární separabilita

Perceptron je nejjednodušší model – hledá přímku (nadrovinu), která oddělí dvě třídy. Funguje jen tehdy, když lze třídy oddělit jednou přímkou (jsou lineárně separabilní).

Slavná past: XOR

Když body jedné třídy leží „do kříže“ (na protilehlých úhlopříčkách), žádná přímka je neoddělí. To je situace XOR – perceptron si s ní neporadí.

Řešený příklad – Perceptron

třída +1: (0,0) a (2,2)  |  třída −1: (0,2) a (2,0)

Body +1 leží na jedné úhlopříčce, body −1 na druhé – přesně vzor XOR. Žádná přímka je neoddělí.

Odpověď: E – žádnou přímku nelze nalézt

👥 K-nearest neighbours (K-NN)

„Řekni mi, kdo jsou tvoji sousedé, a já ti řeknu, kdo jsi.“ Nový bod zařadíme podle k nejbližších trénovacích bodů – hlasováním většiny.

  • k = 1 → rozhoduje jediný nejbližší soused.
  • k = 3 → podívám se na 3 nejbližší a vyhrává většina.
  • Vzdálenost často L1 (manhattanská) = součet absolutních rozdílů, nebo L2 (eukleidovská).

Řešený příklad – K-NN

Trénink: třída A na bodě 0; třída B na bodech 2, 3, 4. Klasifikujeme bod 0,5 (L1 vzdálenost).

Vzdálenosti: k A(0) = 0,5; k B(2) = 1,5; k B(3) = 2,5; k B(4) = 3,5.

k = 1: nejbližší je A (0,5) → A.

k = 3: tři nejbližší jsou A(0,5), B(1,5), B(2,5) → třídy A, B, B → většina B.

Odpověď: B – pro k=1 vyjde A, pro k=3 vyjde B

🌲 Rozhodovací stromy a lesy

Rozhodovací strom rozhoduje sérií otázek ano/ne („docházka ≤ 71 %?“). V každém uzlu si vybere otázku, která data nejlépe rozdělí na třídy.

  • Entropie měří „nepořádek“. Entropie 1 = půl na půl (max. nejistota), entropie 0 = čistá skupina (jedna třída).
  • Kořen stromu = otázka, která přináší nejlepší rozdělení hned v prvním kroku.
  • Random forest (náhodný les) = mnoho stromů hlasuje dohromady → přesnější a stabilnější (ale méně vysvětlitelný – black-box).

Řešený příklad – Rozhodovací strom

Strom má v kořeni otázku docházka ≤ 71 (entropie 1.0, value [6,6] = půl na půl). To znamená, že docházka je nejdůležitější dělicí znak – proto je v kořeni.

Pozor na nesprávné možnosti: docházku nelze vždy vykompenzovat studiem (větev s nízkou docházkou končí „neuspěl“), a vysoká docházka negarantuje úspěch (záleží i na hodinách studia).

Odpověď: C – docházka tvoří kořen, protože nejlépe rozřazuje

📈 Logistická regrese – jak to funguje

Navzdory názvu je to klasifikační metoda. Vrací pravděpodobnost (0–1) pomocí sigmoid (logistické) funkce:

P(y=1|X) = 1 / (1 + e^(-z))    kde  z = b0 + b1·X1 + b2·X2 + ...
  • Výstup je vždy mezi 0 a 1 (pravděpodobnost).
  • Decision boundary: pokud P > 0,5 → třída 1, jinak 0. Práh lze měnit.
  • Koeficienty se odhadují maximalizací věrohodnosti (MLE), ne metodou nejmenších čtverců.

⚖️ Bias-Variance tradeoff (přeučení vs podučení)

Underfitting (velký bias)

Model příliš jednoduchý – neumí ani trénovací data. Nízká přesnost na tréninku i testu.

Příklad: lineární model na nelineárních datech.

Overfitting (velká variance)

Model si data „zapamatoval". Vysoká přesnost na tréninku, nízká na nových datech.

Příklad: příliš hluboký rozhodovací strom.

Jak bojovat s overfittingem
  • Více dat – nejlepší lék.
  • Regularizace (L1/Lasso, L2/Ridge) – penalizuje příliš velké koeficienty.
  • Prořezání stromu (pruning) – omezí hloubku rozhodovacího stromu.
  • Cross-validace – odhalí overfitting před nasazením.

🎰 Bagging vs Boosting (souborové metody)

Bagging (Bootstrap Aggregating)

Trénuje více modelů paralelně na náhodných podmnožinách dat. Výsledek = průměr / hlasování. Snižuje variance (overfitting).

Příklad: Random Forest

Boosting

Modely se trénují sekvenčně – každý opravuje chyby předchozího. Snižuje bias (underfitting).

Příklady: AdaBoost, Gradient Boosting, XGBoost

Klíčový rozdíl

Bagging = paralelní, nezávislé modely → stabilita. Boosting = sekvenční, každý se učí z chyb → přesnější, ale náchylnější na overfitting.

Okruh 8

Strojové učení bez učitele

Data nemají správné odpovědi – model hledá strukturu sám. Shlukování (k-means, hierarchické) a asociační pravidla.

🧪 Co je „bez učitele“

Učení bez učitele (unsupervised) = data nemají žádné štítky. Model sám hledá vzory, skupiny nebo souvislosti.

🎯 Shlukování (clustering)

k-means

Předem zvolíme k shluků. Algoritmus opakovaně: přiřadí body k nejbližšímu středu → přepočítá středy. Dokud se to neustálí.

Aglomerativní (hierarchické)

Začne s každým bodem jako vlastním shlukem a postupně spojuje nejbližší shluky dohromady. Vytvoří strom (dendrogram).

🛒 Asociační pravidla

Hledají, co se kupuje společně: „kdo koupí chleba, koupí i máslo“. Pravidlo {chleba} → {máslo} se hodnotí dvěma mírami:

Support (podpora) = jak často se obě věci vyskytnou společně ze všech nákupů.
support = (košíky s chlebem A máslem) / (všechny košíky)
Confidence (spolehlivost) = z těch, co koupili levou stranu, kolik koupilo i pravou.
confidence = (košíky s chlebem A máslem) / (košíky s chlebem)
Jak to rozlišit

Support dělíme všemi košíky. Confidence dělíme jen těmi, co mají levou stranu pravidla. (Bonus: lift > 1 znamená, že spolu věci souvisí víc, než kdyby byly náhodné.)

Řešený příklad – Asociační pravidla

10 košíků. Chleba v 6 košících. Chleba i máslo zároveň ve 3 košících. Pravidlo {chleba} → {máslo}:

Support = 3 / 10 = 30 % (chleba i máslo ze všech košíků).

Confidence = 3 / 6 = 50 % (z košíků s chlebem mělo i máslo).

Odpověď: C – podpora 30 %, spolehlivost 50 %

📏 Výběr k pro k-means: Elbow metoda

Jak zvolit správný počet shluků k?

  1. Spusť k-means pro k = 1, 2, 3, …
  2. Pro každé k spočítej WCSS (součet čtverců vzdáleností bodů od středu jejich shluku).
  3. Vykresli WCSS vs k. Křivka klesá – kde se „zalomí jako loket" = optimální k.
Omezení k-means
  • Musíš zadat k předem (nezná ho sám).
  • Citlivý na outliery a počáteční středy (řeší: k-means++ inicializace).
  • Funguje dobře jen pro kulovité shluky přibližně stejné velikosti.

🌲 Hierarchické shlukování – linkage a dendrogram

Jak měřit vzdálenost mezi shluky (linkage metody)?

LinkageVzdálenost = …Vlastnost
Single (min)min vzdálenost nejbližších bodůmůže vznikat „řetěz" (chaining)
Complete (max)max vzdálenost nejvzdálenějších bodůkompaktnější, kulovité shluky
Averageprůměr všech párových vzdálenostíkompromis
Wardminimalizuje nárůst WCSSnejčastěji nejlepší pro praxi
Dendrogram = strom spojování shluků. Na y-ose je vzdálenost spojení. „Horizontální řez" dendrogramem na určité výšce určuje počet výsledných shluků.

📈 Lift a Apriori algoritmus

Lift = confidence / P(pravá strana). Říká, o kolik je pravděpodobnější koupit B spolu s A, než kdyby spolu nesouvisely.
Lift > 1 = pozitivní asociace. Lift = 1 = nezávislé. Lift < 1 = negativní.

Příklad: confidence = 50 %, P(máslo) = 40 % → lift = 0,5 / 0,4 = 1,25 → mírná pozitivní asociace.

Apriori algoritmus – efektivní hledání asociačních pravidel: 1) najde frekventované itemsety (support ≥ min_support); 2) vygeneruje pravidla s dostatečnou confidence. Využívá klíčovou vlastnost: každá podmnožina frekventované množiny je také frekventovaná.
Okruh 9

Evaluace modelů

Jak poznat, jestli je model dobrý: matice záměn, precision, recall, ROC/AUC, křížová validace.

🟩 Matice záměn (confusion matrix)

Tabulka, která porovnává předpověď modelu se skutečností u binární klasifikace:

Předpověď: pozitivníPředpověď: negativní
Skutečně pozitivníTP (správně pozitivní)FN (falešně negativní)
Skutečně negativníFP (falešně pozitivní)TN (správně negativní)
Jak si to zapamatovat

Druhé slovo = co řekl model, první slovo = jestli se spletl. False Negative = model řekl „negativní“, ale ve skutečnosti to bylo pozitivní (přehlédl to). False Positive = falešný poplach.

🎯 Metriky: accuracy, precision, recall, F1

MetrikaVzorecCo měří
Accuracy(TP+TN) / všekolik z celku správně
PrecisionTP / (TP+FP)z označených jako pozitivní, kolik jich opravdu je
RecallTP / (TP+FN)ze skutečně pozitivních, kolik jich model zachytil
F1harm. průměr P a Rvyváženost precision a recall

ROC křivka ukazuje poměr zachycených vs. falešných poplachů při různých prazích. AUC (plocha pod křivkou) shrne kvalitu jedním číslem: 1 = perfektní, 0,5 = náhoda.

🔁 Train/test split a křížová validace

  • Rozdělení dat – část na trénink, část na test (model se nesmí testovat na datech, na kterých se učil).
  • Overfitting (přeučení) – model umí trénink nazpaměť, ale na nových datech selhává. Underfitting – moc jednoduchý, neumí ani trénink.

K-fold křížová validace

Data rozdělíme na K dílů. Vždy 1 díl je test, zbytek trénink – a takhle K-krát, výsledky zprůměrujeme.

LOOCV (leave-one-out)

Extrém K-fold, kde K = počet pozorování. Pokaždé testujeme na jediném bodu, zbytek je trénink.

Zapamatuj

LOOCV je speciální případ K-fold validace, kde K = počet všech pozorování.

⚠️ Nevyvážené třídy (Class Imbalance)

Problém: 990 negativních a 10 pozitivních případů. Model, který vždy odpoví „negativní", má accuracy 99 %, ale je k ničemu.

Accuracy klame při nevyvážených datech

U nerovnováhy sleduj raději precision, recall a F1. AUC-ROC je také robustní vůči nevyvážení.

Techniky:

  • Oversampling – přidáme kopie menšinové třídy (SMOTE: syntetické vzorky).
  • Undersampling – odebereme případy z majoritní třídy.
  • Vážení tříd – modelu řekneme, aby chyby na menšinové třídě penalizoval víc (class_weight='balanced').

🎛️ Kdy preferovat Precision vs Recall

Maximalizuj Precision, když…

…falešný poplach (FP) je nákladný. Nechceš označit nevinného.

  • Spamový filtr (raději prošel nevyžádaný mail, než smazat důležitý)
  • Doporučovací systém

Maximalizuj Recall, když…

…přehlédnutí (FN) je nebezpečné. Nesmíš přehlédnout žádný pozitivní případ.

  • Diagnóza rakoviny (raději operovat zdravého, než přehlédnout nemocného)
  • Detekce podvodů, COVID testy
Specificity (= True Negative Rate) = TN / (TN + FP). Kolik ze skutečně negativních správně označíme jako negativní. ROC křivka = Recall (Sensitivity) vs. 1−Specificity.

🔬 Train / Validation / Test rozdělení

Trénovací (60–70 %) + Validační (10–20 %) + Testovací (≈20 %)
  • Trénovací – na tom se model učí.
  • Validační – na tom ladíme hyperparametry (k v K-NN, hloubka stromu…). Model ho „vidí" nepřímo.
  • Testovací – evaluace úplně na závěr, jen jednou. Na testovacích datech nikdy neladíme!
Data leakage

Pokud se testovací data „přimíchají" do tréninku (např. normalizace přes celá data před splitem), výsledky jsou uměle lepší. V praxi model selže.

Okruh 10

Lineární regresní model

Předpověď čísla pomocí přímky. Metoda nejmenších čtverců, interpretace koeficientů, předpoklady, testování.

📉 Co to je

Hledáme vztah, kde výsledek (závislá proměnná Y) závisí lineárně na vstupech (X):

Y = b0 + b1·X1 + b2·X2 + ...
  • b0 = intercept (konstanta) – hodnota Y, když jsou všechna X = 0.
  • b1, b2… = koeficienty (sklony) – o kolik se změní Y, když dané X vzroste o 1 (ostatní beze změny).

Metoda nejmenších čtverců (OLS)

Odhadne koeficienty tak, aby součet druhých mocnin odchylek (rozdílů mezi skutečností a předpovědí) byl co nejmenší – přímka „nejlépe sedne“ na body.

🏷️ Interpretace koeficientů a dummy proměnné

Dummy (binární) proměnná nabývá jen 0 nebo 1 a kóduje kategorii. Např. dům = 1 pro dům, 0 pro byt → byt je referenční kategorie. Koeficient u dummy říká rozdíl oproti referenční kategorii.

Pozor na jednotky!

Vždy si ohlídej jednotky. Když je cena „v tisících Kč“ a koeficient je 2000, znamená to 2000 tisíc = 2 miliony Kč.

Řešený příklad – Interpretace regrese

Model (cena v tisících Kč): cena = 10 + 100·plocha + 2000·dům

Koeficient u dům je 2000 tisíc Kč = 2 miliony Kč. To je rozdíl oproti bytu (referenční kategorie) při stejné ploše.

Při stejné ploše je dům o 2 miliony Kč dražší než byt.

Proč ne ostatní: intercept 10 není průměrná cena bytu (to by musela být plocha 0); +100 m² zvýší cenu o 100·100 = 10 000 tisíc = 10 milionů, ne o tisíc.

Odpověď: B

📐 Předpoklady a testování hypotéz

Předpoklady klasického modelu (zhruba)

  • Linearita – vztah je opravdu lineární.
  • Nezávislost a konstantní rozptyl chyb (homoskedasticita).
  • Chyby mají normální rozdělení a nulový průměr.
  • Vstupy nejsou navzájem silně závislé (žádná multikolinearita).

Testování hypotéz

U každého koeficientu testujeme, zda je významně různý od nuly (t-test). p-hodnota < 0,05 obvykle znamená, že proměnná má statisticky významný vliv. Velká p-hodnota → vliv neprokázán.

📊 R² – koeficient determinace

= podíl variability Y, kterou model vysvětluje. Rozsah 0–1 (nebo záporné u špatného modelu).
R² = 1 - (SS_res / SS_tot)
SS_res = Σ(yi − ŷi)²    (reziduály – nevysvětlená variabilita)
SS_tot = Σ(yi − ȳ)²     (celková variabilita kolem průměru)
  • R² = 1 → model vysvětluje vše (perfektní fit).
  • R² = 0 → model není lepší než průměr.
  • R² = 0,85 → model vysvětluje 85 % variability Y.
Adjusted R² – penalizuje za přidávání nevýznamných proměnných. Přidáš-li nesmyslnou proměnnou, R² vzroste nebo zůstane, ale adjusted R² klesne. Porovnávej modely vždy přes adjusted R².

🔬 F-test a reziduální analýza

F-test – testuje, zda je model jako celek statisticky významný. H₀: všechny koeficienty jsou nulové (model nic nevysvětluje). Nízká p-hodnota F-testu → model celkově smysluplný.

Reziduál = skutečná hodnota − předpověď. Analýza reziduálů ověřuje předpoklady:

  • Normalita – histogram nebo QQ-plot by měl být přibližně normální.
  • Homoskedasticita – rozptyl reziduálů konstantní přes celý rozsah (plot reziduál vs. fitted values = rovnoměrný mrak bez trychtýřového tvaru).
  • Žádná autokorelace – reziduály na sobě nezávisí (Durbin-Watson test).
Multikolinearita

Když jsou dvě vstupní proměnné silně korelované (výška v cm a výška v palcích), koeficienty se stávají nestabilní. Detekce: VIF (Variance Inflation Factor) – VIF > 10 signalizuje problém. Řešení: odstranit jeden z korelovaných prediktorů.

Generálka

★ Vzorový test – vyzkoušej se

Přesně tyhle otázky byly ve vzorovém testu. Klikni na odpověď – hned uvidíš, jestli je správně, a krátké vysvětlení. Nech si to na úplný konec učení.
Poslední opakování

⚡ Rychlý tahák před zkouškou

Projdi ráno před testem. Jen ty nejdůležitější věci, co musíš mít v hlavě.

1. Algoritmy a složitost

  • BST: vlevo menší, vpravo větší. Výška = počet HRAN nejdelší cesty z kořene.
  • Big-O: 1 cyklus = O(n), 2 vnořené = O(n²), půlení = O(log n), merge sort = O(n log n). Pozor na return v cyklu – sráží složitost.
  • Halting problem = nejde algoritmicky vyřešit.
  • Tautologie = vždy pravda (A ∨ ¬A). Kontradikce = vždy lež (A ∧ ¬A).
  • Implikace A→B je nepravdivá jen když A=1 a B=0.
  • Rekurze musí mít base case, jinak nekonečná smyčka.

2. XAI

  • White-box (strom, pravidla, lin. regrese) = vidím dovnitř. Black-box (neuronky, lesy) → vysvětlí LIME / SHAP.
  • LIME = lokální, aproximativní. SHAP = spravedlivý podíl (teorie her), lokální i globální.
  • SHAP > 0 = zvýšil předpověď. SHAP < 0 = snížil.
  • PDP = globální vizualizace vlivu jedné proměnné.

3. Text

  • BoW = počítá výskyty slov, ignoruje pořadí. Stejná slova → stejný vektor.
  • TF-IDF = TF × IDF. Vzácná, ale v dokumentu častá slova = vysoká váha.
  • Embeddings = podobná slova mají podobné vektory (zachycuje význam).
  • Kosinová podobnost = (d1·d2)/(|d1|·|d2|). 1 = stejné, 0 = nesouvisí.
  • Stemming (hrubý) vs lemmatizace (přesný slovníkový tvar).

4. Programování

  • OOP: třída (vzor), objekt (instance), dědičnost (potomek přebírá z rodiče), polymorfismus, zapouzdření.
  • Interface = smlouva (co třída umí), ne jak to dělá. Třída implementuje více interface.
  • Stack = LIFO. Queue = FIFO. Hash mapa = O(1) přístup klíčem.
  • Projít všechny prvky → cyklus.

5. Vývoj SW

  • Git: sloučit větve = merge.
  • Singleton = jen jedna instance. MVC = Model/View/Controller. Observer = upozornění na změnu.
  • CI/CD = automatický build, test, deploy. Docker = kontejner s celou aplikací.
  • REST API: GET=čtení, POST=vytvoření, PUT=update, DELETE=smazání.
  • TDD = nejprve test, pak kód (Red → Green → Refactor).

6. Databáze

  • M:N se řeší vazební tabulkou. LEFT JOIN = ber i řádky bez páru.
  • COUNT + GROUP BY = počítej skupiny. HAVING = filtr po GROUP BY (ne WHERE).
  • ACID: Atomicity, Consistency, Isolation, Durability.
  • 3NF = žádná tranzitivní závislost neklíčových atributů.
  • JSON = REST API standard. XML = starší, enterprise.

7.–8. Strojové učení

  • S učitelem = známe odpovědi. Bez učitele = hledáme strukturu.
  • Perceptron = jen lineárně oddělitelné. XOR (do kříže) nejde.
  • K-NN: hlasuje k nejbližších sousedů. Strom: kořen = nejlepší dělicí znak, entropie 0 = čisto.
  • Bagging (Random Forest) = paralelní, snižuje varianci. Boosting (XGBoost) = sekvenční, snižuje bias.
  • Overfitting: dobrý na tréninku, špatný na testu. Léky: více dat, regularizace, pruning.
  • k-means: Elbow metoda pro výběr k. Ward linkage = nejlepší pro praxi.
  • Lift > 1 = pozitivní asociace. Apriori = podmnožina frekventované množiny je frekventovaná.

9.–10. Evaluace a regrese

  • False Negative = bylo pozitivní, model řekl negativní (přehlédl).
  • Precision = TP/(TP+FP). Recall = TP/(TP+FN). AUC: 1 = perfekt, 0,5 = náhoda.
  • Accuracy klame u nevyvážených dat → sleduj F1, AUC.
  • Recall preferuj u diagnóz. Precision preferuj u spamu.
  • LOOCV = K-fold s K = počet pozorování.
  • Regrese: koeficient = o kolik se změní Y při +1 v X. Dummy = rozdíl proti referenční kategorii. OLS minimalizuje čtverce odchylek.
  • = podíl vysvětlené variability. Adjusted R² penalizuje za zbytečné proměnné.
  • F-test = je model jako celek smysluplný? VIF > 10 = multikolinearita.
Poslední rada

Když si nebudeš jistý, vyluč zjevně špatné možnosti a vyber tu, co dává logicky a jednotkově smysl. Hodně štěstí zítra – zvládneš to. 🍀