Problème
La régression linéaire trouve la droite y = slope × x + intercept qui s'ajuste le mieux aux données, c'est-à-dire qui minimise la somme des carrés des erreurs. Pour une seule variable d'entrée, il existe une formule exacte :
- slope = Σ(x - x̄)(y - ȳ) / Σ(x - x̄)²
- intercept = ȳ - slope × x̄
où x̄ et ȳ sont les moyennes de xs et ys. Si tous les xs sont égaux, renvoyez slope 0 et intercept ȳ.
Implémentez linear_regression(xs, ys).
Entrée
xs, ys : les valeurs x et y des points (même longueur).
Sortie
Renvoyez [slope, intercept].
Contraintes
1 ≤ nombre de points ≤ 10 000
-10 000 ≤ chaque valeur ≤ 10 000
Exemples
Entrée :
xs = [1.0, 2.0, 3.0, 4.0]
ys = [3.0, 5.0, 7.0, 9.0]
Sortie attendue :
expected = [2.0, 1.0]
Entrée :
std::vector<double> xs = {1.0, 2.0, 3.0, 4.0};
std::vector<double> ys = {3.0, 5.0, 7.0, 9.0};
Sortie attendue :
std::vector<double> expected = {2.0, 1.0};
Entrée :
double[] xs = new double[] {1.0, 2.0, 3.0, 4.0};
double[] ys = new double[] {3.0, 5.0, 7.0, 9.0};
Sortie attendue :
double[] expected = new double[] {2.0, 1.0};
Explication
Les points sont exactement sur y = 2x + 1. x̄ = 2.5, ȳ = 6, Σ(x - x̄)(y - ȳ) = 10 et Σ(x - x̄)² = 5, donc slope = 2 et intercept = 6 - 2 × 2.5 = 1.
Entrée :
xs = [0.0, 1.0, 2.0]
ys = [1.0, 3.0, 2.0]
Sortie attendue :
expected = [0.5, 1.5]
Entrée :
std::vector<double> xs = {0.0, 1.0, 2.0};
std::vector<double> ys = {1.0, 3.0, 2.0};
Sortie attendue :
std::vector<double> expected = {0.5, 1.5};
Entrée :
double[] xs = new double[] {0.0, 1.0, 2.0};
double[] ys = new double[] {1.0, 3.0, 2.0};
Sortie attendue :
double[] expected = new double[] {0.5, 1.5};
Explication
x̄ = 1 et ȳ = 2. Σ(x - x̄)(y - ȳ) = (-1)(-1) + 0 + (1)(0) = 1 et Σ(x - x̄)² = 2, donc slope = 0.5 et intercept = 2 - 0.5 × 1 = 1.5.
Références
Ce défi a été adapté pour CodeUtility. Suivez l'énoncé et les contraintes ci-dessus.