All challenges
Easy 0 solved 0% acceptance

Loss Functions: MSE, MAE and Cross-Entropy

Measure how wrong a model's predictions are with mean squared error, mean absolute error or binary cross-entropy.

What you'll learn

  • Measure prediction error in three ways
  • Clip probabilities to avoid log(0)
  • Choose a loss for regression or classification

Problem

A loss function turns a model's mistakes into one number to minimize. Implement compute_loss(kind, predictions, targets) for three common losses, where n is the number of predictions:

  • "mse" (mean squared error): average of (p - t)²
  • "mae" (mean absolute error): average of |p - t|
  • "binary_cross_entropy": -average of [t × ln(p) + (1 - t) × ln(1 - p)]. First clip each prediction p to the range [0.0000001, 0.9999999] so the logarithm is never ln(0).

Input

kind: "mse", "mae" or "binary_cross_entropy".

predictions: The model's predictions.

targets: The correct values (same length). For cross-entropy they are 0 or 1 and predictions are between 0 and 1.

Output

Return the loss as a decimal number.

Constraints

1 ≤ length ≤ 1,000

-1,000 ≤ each value ≤ 1,000 (0 ≤ p ≤ 1 and t ∈ {0, 1} for cross-entropy)

Examples

Example 1
Input:
kind = "mse"
targets = [3.0, -0.5, 2.0]
predictions = [2.5, 0.0, 2.0]

Expected output:
expected = 0.166667
Input:
std::string kind = "mse";
std::vector<double> targets = {3.0, -0.5, 2.0};
std::vector<double> predictions = {2.5, 0.0, 2.0};

Expected output:
double expected = 0.166667;
Input:
string kind = "mse";
double[] targets = new double[] {3.0, -0.5, 2.0};
double[] predictions = new double[] {2.5, 0.0, 2.0};

Expected output:
double expected = 0.166667;

Explanation

Squared errors: 0.5² = 0.25, 0.5² = 0.25 and 0² = 0. Their average is 0.5 / 3 ≈ 0.166667.

Example 2
Input:
kind = "binary_cross_entropy"
targets = [1.0, 0.0]
predictions = [0.9, 0.2]

Expected output:
expected = 0.164252
Input:
std::string kind = "binary_cross_entropy";
std::vector<double> targets = {1.0, 0.0};
std::vector<double> predictions = {0.9, 0.2};

Expected output:
double expected = 0.164252;
Input:
string kind = "binary_cross_entropy";
double[] targets = new double[] {1.0, 0.0};
double[] predictions = new double[] {0.9, 0.2};

Expected output:
double expected = 0.164252;

Explanation

-(ln(0.9) + ln(1 - 0.2)) / 2 = -(-0.105361 - 0.223144) / 2 ≈ 0.164252. Confident correct predictions give a small loss.

How to approach it

Try on your own first, then open one hint at a time.

Hint 1

Each loss compares predictions to targets element by element and then averages the per-example errors.

Hint 2

For cross-entropy, clamp predictions away from 0 and 1 before taking logarithms.

Hint 3

Remember that absolute value and squaring are different, and cross-entropy uses the target as a weight on each log term.

Expected complexity

O(n) time, O(1) extra space

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.