Tutte le sfide
Media 0 risolte 0% di accettazione

Regressione lineare con discesa del gradiente

Impara pendenza e intercetta di una retta scendendo passo dopo passo lungo l'errore quadratico medio.

Cosa imparerai

  • Minimizzare l'errore quadratico medio passo dopo passo
  • Calcolare i gradienti di pendenza e intercetta
  • Vedere come il learning rate influenza l'addestramento

Problema

Invece di una formula, addestra la retta y = w × x + b con la discesa del gradiente a batch sull'errore quadratico medio MSE = Σ(w × x + b - y)² / n.

Parti da w = 0 e b = 0. In ogni epoca, usando tutti i punti:

  1. errorᵢ = w × xᵢ + b - yᵢ
  2. dw = (2 / n) × Σ errorᵢ × xᵢ e db = (2 / n) × Σ errorᵢ
  3. w ← w - learning_rate × dw e b ← b - learning_rate × db (entrambi calcolati dagli stessi errori)

Implementa train_linear_regression(xs, ys, learning_rate, epochs).

Input

xs, ys: I punti dati (stessa lunghezza).

learning_rate, epochs: Il passo e il numero di aggiornamenti.

Output

Restituisci [w, b] dopo l'addestramento.

Vincoli

1 ≤ numero di punti ≤ 1.000, 0 ≤ epochs ≤ 10.000

0 < learning_rate ≤ 1

-100 ≤ ogni valore ≤ 100

Esempi

Esempio 1
Input:
xs = [1.0, 2.0]
ys = [2.0, 4.0]
epochs = 1
learning_rate = 0.1

Output atteso:
expected = [1.0, 0.6]
Input:
std::vector<double> xs = {1.0, 2.0};
std::vector<double> ys = {2.0, 4.0};
long long epochs = 1;
double learning_rate = 0.1;

Output atteso:
std::vector<double> expected = {1.0, 0.6};
Input:
double[] xs = new double[] {1.0, 2.0};
double[] ys = new double[] {2.0, 4.0};
long epochs = 1;
double learning_rate = 0.1;

Output atteso:
double[] expected = new double[] {1.0, 0.6};

Spiegazione

Con w = b = 0 gli errori sono -2 e -4. dw = (2 / 2) × (-2×1 - 4×2) = -10 e db = (2 / 2) × (-2 - 4) = -6, quindi w = 0 - 0.1 × (-10) = 1 e b = 0 - 0.1 × (-6) = 0.6. Risultato: [1, 0.6].

Esempio 2
Input:
xs = [1.0, 2.0, 3.0]
ys = [3.0, 5.0, 7.0]
epochs = 2000
learning_rate = 0.05

Output atteso:
expected = [2.0, 1.0]
Input:
std::vector<double> xs = {1.0, 2.0, 3.0};
std::vector<double> ys = {3.0, 5.0, 7.0};
long long epochs = 2000;
double learning_rate = 0.05;

Output atteso:
std::vector<double> expected = {2.0, 1.0};
Input:
double[] xs = new double[] {1.0, 2.0, 3.0};
double[] ys = new double[] {3.0, 5.0, 7.0};
long epochs = 2000;
double learning_rate = 0.05;

Output atteso:
double[] expected = new double[] {2.0, 1.0};

Spiegazione

I dati stanno su y = 2x + 1. Dopo 2.000 epoche la discesa del gradiente è converguta a w = 2 e b = 1, la stessa risposta della formula dei minimi quadrati.

Riferimenti

Questa sfida è adattata per CodeUtility. Segui la traccia e i vincoli sopra.

Impara dagli altri

Soluzioni della community

Nessuna soluzione pubblicata. Risolvi questa sfida per condividere la prima.