# Lineární regrese

Lineární regrese je jediná metoda v téhle wiki, která má **řešení v uzavřeném tvaru**. Nic se neiteruje, nic nekonverguje, nic nezávisí na náhodné inicializaci. Vyřešíš soustavu dvou rovnic a máš přesnou odpověď.

Proto se s ní začíná a proto stojí za to ji umět spočítat ručně - je to jediná příležitost vidět, jak vypadá optimalizace, u které si můžeš výsledek ověřit na papíře.

Tahle stránka ukazuje model, metodu nejmenších čtverců a spočítá jeden příklad úplně. Předpokládá to [klasifikaci a rozpoznávání](Klasifikace-a-rozpoznavani) jen kvůli zařazení - regrese patří mezi metody učení s učitelem, ale nepředpovídá třídu, nýbrž **spojitou hodnotu**.

## Model

Cílem je predikovat spojitou hodnotu `y` na základě vstupních hodnot `x`:

```
y = ax + b (+ ε)
```

To `ε` na konci je **chyba měření** a je to nejdůležitější symbol v celé rovnici. Říká, že body neleží na přímce a ani se to nečeká. Kdyby ležely, není co počítat.

Rozdíl proti [klasifikaci](Klasifikace-a-rozpoznavani) je v tom, co je výstupem. Klasifikátor vrací **třídu** z konečné množiny. Regrese vrací **číslo** ze spojitého rozsahu. Tomu odpovídá i chybová funkce - u klasifikace počítáš, kolikrát ses trefil, u regrese o kolik jsi vedle.

## Metoda nejmenších čtverců

Minimalizujeme součet čtverců reziduí, tedy svislých odchylek bodů od přímky:

```
S(a, b) = Σ (yi − ŷi)²  →  min
```

**Proč zrovna čtverce, a ne absolutní hodnoty?** Dva důvody, a oba stojí za to znát:

Zaprvé, čtverec je **diferencovatelný všude**, takže se dá minimum najít derivací a vyjde soustava lineárních rovnic. Absolutní hodnota má v nule zlom a řešení se musí hledat numericky.

Zadruhé, čtverec **tvrdě trestá velké odchylky**. Bod vzdálený o 10 přispěje stem, deset bodů vzdálených o 1 přispěje deseti. To je občas přesně to, co chceš, a občas to znamená, že jeden odlehlý bod ti přetáhne celou přímku k sobě. **Nejmenší čtverce nejsou robustní vůči odlehlým hodnotám** a je to jejich hlavní slabina.

## Soustava normálních rovnic

Přímka `y = ax + b` proložená metodou nejmenších čtverců souborem bodů `[x1, y1], ..., [xn, yn]` má koeficienty splňující:

```
a · Σxi² + b · Σxi = Σ xi·yi        (1)
a · Σxi  + b · n   = Σ yi           (2)
```

Dvě rovnice, dvě neznámé. **To je celé.** Nic víc lineární regrese s jedním vstupem není.

## Spočítej si to

Body: `(0, 5)`, `(1, 3)`, `(3, 3)`, `(5, 2)`, `(6, 1)`, tedy `n = 5`.

Tabulka, kterou si nakreslíš vždycky:

| `i` | `xi` | `yi` | `xi²` | `xi·yi` |
|---|---|---|---|---|
| 1 | 0 | 5 | 0 | 0 |
| 2 | 1 | 3 | 1 | 3 |
| 3 | 3 | 3 | 9 | 9 |
| 4 | 5 | 2 | 25 | 10 |
| 5 | 6 | 1 | 36 | 6 |
| **Σ** | **15** | **14** | **71** | **28** |

Dosaď do soustavy:

```
71a + 15b = 28
15a +  5b = 14
```

Řešení:

```
a = −7/13  ≈ −0,538
b = 287/65 ≈  4,415
```

Výsledná přímka:

```
y = −0,538x + 4,415
```

Zkontroluj si to hrubým odhadem. Pro `x = 0` vychází `4,4` a naměřeno bylo `5`. Pro `x = 6` vychází `1,2` a naměřeno bylo `1`. Sedí to.

**Sloupce `xi²` a `xi·yi` jsou jediné, co se počítá.** Zbytek je dosazení a vyřešení dvou rovnic. Když si tuhle tabulku zapamatuješ, spočítáš regresi na papíře za tři minuty.

## Kde lineární regrese přestává platit

**Vztah není lineární.** Vyjde ti přímka a bude nesmyslná. Poznáš to na grafu reziduí - když v nich vidíš systematický tvar (oblouk, vlnu), model má špatnou třídu funkcí. Řeší se to polynomiální regresí nebo transformací proměnných.

**Jeden odlehlý bod přetáhne přímku.** Čtverce trestají velké odchylky, takže se přímka nakloní k odlehlému bodu, aby jeho příspěvek zmenšila. Buď takové body odstraň, nebo použij robustnější metodu (nejmenší absolutní odchylky, Huberova ztráta).

**Korelace není kauzalita.** Regrese ti řekne, že `y` roste s `x`. Neřekne ti, že `x` způsobuje `y`. Klasický příklad: prodej zmrzliny koreluje s počtem utonutí. Obojí způsobuje léto.

**Extrapolace mimo rozsah dat je hazard.** Přímka spočítaná na `x` od 0 do 6 nemá důvod platit pro `x = 100`. Model neví nic o tom, co je za hranicí dat.

## Souvislost se zbytkem wiki

**Nejmenší čtverce jsou totéž, co ztrátová funkce v neuronové síti.** Podívej se na `Etotal = ½ Σ (tk − yk)²` u [backpropagation](MLP-a-backpropagation#ztrátová-funkce-a-gradientní-sestup) - je to úplně stejný výraz. Rozdíl je jen v tom, že u přímky se minimum najde vyřešením soustavy, zatímco u sítě se k němu musí sestupovat po gradientu, protože soustava je nelineární a nemá uzavřené řešení.

**Neuron bez aktivační funkce je lineární regrese.** Vážený součet vstupů plus práh je přesně `ax + b`, jen s víc vstupy. Celá myšlenka [umělého neuronu](Neuron-a-perceptron) je lineární model, kterému se přidala nelinearita.

## Shrnutí v jedné větě

Sestav si tabulku se sloupci `xi`, `yi`, `xi²` a `xi·yi`, sečti je, dosaď do dvou normálních rovnic a máš přímku - a zároveň víš, jak vypadá optimalizace, kterou zbytek téhle wiki řeší iterativně, protože se u něj vyřešit nedá.
