Zápočtový úkol 4#
Uvažujte následující situaci. Provádíte experiment a naměříte sadu dat. Bohužel jste ale ztratili vaše teoretické poznámky k experimentu a již nevíte, jakým zákonem/vzorečkem se data řídí. Nedokážete již tedy proložit data odpovídající modelovou funkcí a získat parametry tohoto modelu. Přesto nezačnete zoufat a tuto patálii vyřešíte pomocí numerických nástrojů na počítači. Záchranou je pro vás, že jste si zapamatovali, že se data řídí polynomiální závislostí. Již ale neznáte přesný stupeň onoho polynomu.
Definice úlohy:
Uvažujte \(N=100\) dvojic \((x_i, y_i)\) tvořící experimentální data. Data získáte pomocí funkce (xdata, ydata) = proved_experiment()
(implementované v binárním souboru experiment.pyc
), která volí náhodný stupeň polynomu \(m \in [0,10]\), pro který vygeneruje odpovídající náhodná data s přidaným gausovským šumem (podle normálního rozdělení). Funkce vrací dva vektory/pole \(\vec{x}\) a \(\vec{y}\). S každým novým voláním této funkce jsou vygenerována data pro jiný modelový polynom!
Vygenerujte experimentální data pomocí připravené funkce
proved_experiment()
.Rozdělte data na trénovací a testovací v poměru 3:1 (testovacích dat je třeba méně). Rozdělte data do skupin náhodně tak, aby byly data rovnoměrně rozprostřeny v celém intervalu v obou skupinách!
Natrénujte/spočítejte parametry modelu s využitím trénovacích dat.
Aplikujte model na testovací data a spočítejte chybu, které se model na těchto datech dopouští - účelová funkce \(S\) (viz cvičení).
Opakujte kroky 3. a 4. pro různé stupně polynomu a na základě chyby testovacích dat určete parametry a stupeň polynomu modelu.
Cílem je pro libovolné zavolání funkce experimentu najít ideální model, který odpovídá datům nejlépe. Funkce proved_experiment()
je již importována v připravené buňce v tomto notebooku, stačí ji zavolat. Pokud chcete řešit úlohu lokálně na osobním počítači, je třeba si spolu s notebookem stáhnout soubor experiment.pyc
ze složky ukoly/
.
Vykreslete závislost testovací chyby na stupni modelového polynomu. Vykreslete vygenerované data a funkci optimálního modelu.
Bonus:
Upravte krok 2. tak, že místo jednoduché validace použijete pokročilejší křížovou validaci (cross validation). Použijte například tento typ cross validace. Tato metoda je efektivnější pro ohodnocení modelu pro malé množství dat.
Validace - rozdělení dat na trénovací a testovací části - se běžně používá při modelování dat. Je to základní nástroj pro ohodnocení například neuronových sítí.
Princip spočívá v balacování mezi přetrénováním (oversampling) a podtrénováním (undersampling - bias). Tato myšlenka se také nazývá bias-variance tradeoff.
Když bychom volili větší a větší stupeň polynomu, podaří se nám nafitovat model datům čím dál přesněji. Pro volbu \(m=N\) se dostáváme k interpolaci - fit bude procházet všemi data pointy přesně. Dopustíme se ale tzv. přetrénování, jelikož bude model v datech hledat více vlastností/stupnů volnosti/více křivosti než v nich je. Pak když použijeme model na predikování nových dat, bude příliž citlivý na šum v hodnotách \(x\).
Naopak pokud zvolíme příliž nízký stupeň polynomu, nebude model schopný zachytit podstatný charakter schovaný v datech a bude se dopouštět velké chyby z důvodu neznalosti (bias). Takový model není sice citlivý na šum, ale je zpočátku nepřesný.
Díky využití části dat, na kterých model netrénujeme, lze model otestovat a získat hodnocení, jak si model vede na nových, předem neznámých datech. Když nalezneme minimum chyby na testovacích datech, dostaneme ideální tvar modelu.
import numpy as np
import matplotlib.pyplot as plt
Import funkce experimentu:
from experiment import proved_experiment
Řešení úlohy:
## DOPLŇTE ##