Problem
Statt einer Formel trainiere die Gerade y = w × x + b mit Batch-Gradientenabstieg auf dem mittleren quadratischen Fehler MSE = Σ(w × x + b - y)² / n.
Beginne mit w = 0 und b = 0. Verwende in jeder Epoche alle Punkte:
- errorᵢ = w × xᵢ + b - yᵢ
- dw = (2 / n) × Σ errorᵢ × xᵢ und db = (2 / n) × Σ errorᵢ
- w ← w - learning_rate × dw und b ← b - learning_rate × db (beide aus denselben Fehlern berechnet)
Implementiere train_linear_regression(xs, ys, learning_rate, epochs).
Eingabe
xs, ys: Die Datenpunkte (gleiche Länge).
learning_rate, epochs: Die Schrittweite und die Anzahl der Aktualisierungen.
Ausgabe
Gib nach dem Training [w, b] zurück.
Einschränkungen
1 ≤ Anzahl der Punkte ≤ 1.000, 0 ≤ epochs ≤ 10.000
0 < learning_rate ≤ 1
-100 ≤ jeder Wert ≤ 100
Beispiele
Eingabe:
xs = [1.0, 2.0]
ys = [2.0, 4.0]
epochs = 1
learning_rate = 0.1
Erwartete Ausgabe:
expected = [1.0, 0.6]
Eingabe:
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;
Erwartete Ausgabe:
std::vector<double> expected = {1.0, 0.6};
Eingabe:
double[] xs = new double[] {1.0, 2.0};
double[] ys = new double[] {2.0, 4.0};
long epochs = 1;
double learning_rate = 0.1;
Erwartete Ausgabe:
double[] expected = new double[] {1.0, 0.6};
Erläuterung
Mit w = b = 0 sind die Fehler -2 und -4. dw = (2 / 2) × (-2×1 - 4×2) = -10 und db = (2 / 2) × (-2 - 4) = -6, also w = 0 - 0.1 × (-10) = 1 und b = 0 - 0.1 × (-6) = 0.6. Ergebnis: [1, 0.6].
Eingabe:
xs = [1.0, 2.0, 3.0]
ys = [3.0, 5.0, 7.0]
epochs = 2000
learning_rate = 0.05
Erwartete Ausgabe:
expected = [2.0, 1.0]
Eingabe:
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;
Erwartete Ausgabe:
std::vector<double> expected = {2.0, 1.0};
Eingabe:
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;
Erwartete Ausgabe:
double[] expected = new double[] {2.0, 1.0};
Erläuterung
Die Daten liegen auf y = 2x + 1. Nach 2.000 Epochen ist der Gradientenabstieg zu w = 2 und b = 1 konvergiert, dieselbe Antwort wie die Formel der kleinsten Quadrate.
Referenzen
Diese Aufgabe wurde für CodeUtility angepasst. Beachte die oben genannten Vorgaben und Einschränkungen.