Regresja liniowa to jedna z najprostszych i najbardziej fundamentalnych technik w analizie statystycznej i uczeniu maszynowym. Jest to metoda wykorzystywana do modelowania relacji między zmienną zależną (odpowiedzią) a jedną lub więcej zmiennymi niezależnymi (cechami). Model regresji liniowej próbuje po prostu dopasować linię, która najlepiej opisuje zależność między zmiennymi.
Teoria
Matematycznie, można to zapisać jako:
y = \beta_0 + \beta_1 x
Gdzie:
* y to zmienna zależna,
* x to zmienna niezależna,
* \beta_0 to wyraz wolny,
* \beta_1 to współczynnik kierunkowy (pochodna).
Natomiast dla większej liczby zmiennych niezależnych:
y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \ldots + \beta_i x_i
Czyli, najprościej rzecz ujmując, szukamy takich wartości współczynników \beta, które pozwolą na rozwiązanie układu złożonego z powyższych równań, dla każdej z naszych obserwacji. Warto jednak zauważyć, że rozwiązanie analityczne układu równań dla dużego zbioru danych może być bardzo kosztowne obliczeniowo. Gdy metody analityczne zawiodą, z pomocą przychodzą metody iteracyjne, takie jak chociażby algorytm gradientu prostego, który to jest w stanie szybko poradzić sobie z dużymi zestawami danych i problemami współliniowości.
Sama metoda spadku gradientu to technika optymalizacyjna używana w uczeniu maszynowym i sztucznej inteligencji do minimalizacji funkcji kosztu. Zaczynamy od losowo wybranych początkowych wartości parametrów modelu. Następnie, iteracyjnie aktualizujemy te parametry, kierując się w stronę największego spadku funkcji kosztu (stąd nazwa “spadek gradientu”). Proces ten kontynuujemy, aż do osiągnięcia pewnego warunku stopu, na przykład do momentu, gdy różnica w wartościach funkcji kosztu między kolejnymi iteracjami stanie się wystarczająco mała. W kontekście regresji liniowej, funkcją kosztu jest zazwyczaj błąd kwadratowy, który chcemy zminimalizować. W każdej iteracji metody spadku gradientu, parametry modelu są aktualizowane w kierunku, który najbardziej redukuje ten błąd kwadratowy.
Przykład
Prześledźmy iteracyjne wyznaczenie współczynników \beta, minimalizując sumę kwadratów, na przykładzie zbioru pięciu mieszkań, kolejno o powierzchni i cenie, odpowiednio: 40m2 – 200 tys. zł, 60m2 – 280 tys. zł, 80m2 – 360 tys. zł, 100m2 – 440 tys. zł, 120m2 – 520 tys. zł.
Dane:
x = [40, 60, 80, 100, 120]
y = [200, 280, 360, 440, 520]
n = 5
Początkowe parametry:
\beta_0 = 0
\beta_1 = 0
Współczynnik uczenia: \alpha = 0.0001
Iteracja 1:
Obliczmy gradienty:
\frac{\partial J}{\partial \beta_0} = \frac{1}{n}\sum_{i=1}^{n} (\beta_0 + \beta_1 x^{(i)} – y^{(i)}) = -\frac{1}{5}(200 + 280 + 360 + 440 + 520) = -400
\frac{\partial J}{\partial \beta_1} = \frac{1}{n}\sum_{i=1}^{n} (\beta_0 + \beta_1 x^{(i)} – y^{(i)}) \cdot x^{(i)} = -\frac{1}{5}(200 * 40 + 280 * 60 + 360 * 80 + 440 * 100 + 520 * 120) = -32000
Zaktualizujmy parametry:
\beta_0 = \beta_0 – \alpha \cdot \frac{\partial J}{\partial \beta_0} = 0 – 0.0001 \cdot (-400) = 0.04
\beta_1 = \beta_1 – \alpha \cdot \frac{\partial J}{\partial \beta_1} = 0 – 0.0001 \cdot (-32000) = 3.2
Iteracja 2:
Jeszcze raz, analogicznie, obliczmy gradienty i zaktualizujmy parametry:
\frac{\partial J}{\partial \beta_0} = \frac{1}{n}\sum_{i=1}^{n} (\beta_0 + \beta_1 x^{(i)} – y^{(i)})
\frac{\partial J}{\partial \beta_0} = \frac{1}{5} ((0.04 + 3.2 * 40 – 200) + (0.04 + 3.2 * 60 – 280) + (0.04 + 3.2 * 80 – 360) + (0.04 + 3.2 * 100 – 440) + (0.04 + 3.2 * 120 – 520)) = -104
\frac{\partial J}{\partial \beta_1} = \frac{1}{n}\sum_{i=1}^{n} (\beta_0 + \beta_1 x^{(i)} – y^{(i)}) \cdot x^{(i)}
\frac{\partial J}{\partial \beta_1} = \frac{1}{5} ((0.04 + 3.2 * 40 – 200) * 40 + (0.04 + 3.2 * 60 – 280) * 60 + (0.04 + 3.2 * 80 – 360) * 80 + (0.04 + 3.2 * 100 – 440) * 100 + (0.04 + 3.2 * 120 – 520) * 120) = -9040
\beta_0 = \beta_0 – \alpha \cdot \frac{\partial J}{\partial \beta_0} = 0.04 – 0.0001 \cdot (-104) \approx 0.05
\beta_1 = \beta_1 – \alpha \cdot \frac{\partial J}{\partial \beta_1} = 3.2 – 0.0001 \cdot (-9040) \approx 4.10
Z każdą kolejną iteracją, wartości te powinny zbliżać się do optymalnych (\beta_0 = 40, \beta_1 = 4 ). Jeśli chcesz to sprawdzić samemu, przetestuj poniższy kod python:
import numpy as np # Definicja danych x = np.array([40, 60, 80, 100, 120]) y = np.array([200, 280, 360, 440, 520]) # Ustawienie wartości początkowych i współczynnika uczenia b0 = 0.0 b1 = 0.0 alpha = 0.0001 n_iterations = 1000 # liczba iteracji # Pętla iteracji for iteration in range(n_iterations): # Obliczanie gradientów dJ_db0 = np.mean(b0 + b1*x - y) dJ_db1 = np.mean((b0 + b1*x - y) * x) # Aktualizacja parametrów b0 = b0 - alpha * dJ_db0 b1 = b1 - alpha * dJ_db1 # Wyświetlanie parametrów po każdej iteracji print(f"Iteration {iteration+1}: b0 = {b0}, b1 = {b1}")
Metoda spadku gradientu jest jednym z numerycznych sposobów rozwiązania problemu regresji liniowej. Wybrany przez nas współczynnik uczenia oraz liczba iteracji będą miały wpływ na tempo i dokładność zbieżności do optymalnego rozwiązania.