All challenges
Medium 0 solved 0% acceptance

Linear Regression with Gradient Descent

Learn the slope and intercept of a line by repeatedly stepping down the mean squared error.

What you'll learn

  • Minimize mean squared error step by step
  • Compute gradients for slope and intercept
  • See how the learning rate affects training

Problem

Instead of a formula, train the line y = w × x + b with batch gradient descent on the mean squared error MSE = Σ(w × x + b - y)² / n.

Start with w = 0 and b = 0. In each epoch, using all points:

  1. errorᵢ = w × xᵢ + b - yᵢ
  2. dw = (2 / n) × Σ errorᵢ × xᵢ and db = (2 / n) × Σ errorᵢ
  3. w ← w - learning_rate × dw and b ← b - learning_rate × db (both computed from the same errors)

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

Input

xs, ys: The data points (same length).

learning_rate, epochs: The step size and the number of updates.

Output

Return [w, b] after training.

Constraints

1 ≤ number of points ≤ 1,000, 0 ≤ epochs ≤ 10,000

0 < learning_rate ≤ 1

-100 ≤ each value ≤ 100

Examples

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

Expected output:
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;

Expected output:
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;

Expected output:
double[] expected = new double[] {1.0, 0.6};

Explanation

With w = b = 0 the errors are -2 and -4. dw = (2 / 2) × (-2×1 - 4×2) = -10 and db = (2 / 2) × (-2 - 4) = -6, so w = 0 - 0.1 × (-10) = 1 and b = 0 - 0.1 × (-6) = 0.6. Result: [1, 0.6].

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

Expected output:
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;

Expected output:
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;

Expected output:
double[] expected = new double[] {2.0, 1.0};

Explanation

The data lies on y = 2x + 1. After 2,000 epochs gradient descent has converged to w = 2 and b = 1, the same answer as the least squares formula.

References

This challenge is adapted for CodeUtility. Follow the statement and constraints above.

Learn from others

Community solutions

No published solutions yet. Solve this challenge to share the first one.