К списку задач
Легко Решено: 0 Процент решений: 0%

Функции потерь: MSE, MAE и перекрёстная энтропия

Измерьте, насколько ошибаются предсказания модели, с помощью среднеквадратичной ошибки, средней абсолютной ошибки или бинарной перекрёстной энтропии.

Чему вы научитесь

  • Измерять ошибку предсказания тремя способами
  • Ограничивать вероятности, чтобы избежать log(0)
  • Выбирать функцию потерь для регрессии или классификации

Условие

Функция потерь превращает ошибки модели в одно число, которое нужно минимизировать. Реализуйте compute_loss(kind, predictions, targets) для трёх распространённых функций потерь, где n — число предсказаний:

  • "mse" (среднеквадратичная ошибка): среднее от (p - t)²
  • "mae" (средняя абсолютная ошибка): среднее от |p - t|
  • "binary_cross_entropy": минус среднее от [t × ln(p) + (1 - t) × ln(1 - p)]. Сначала ограничьте каждое предсказание p диапазоном [0.0000001, 0.9999999], чтобы логарифм никогда не был ln(0).

Входные данные

kind: "mse", "mae" или "binary_cross_entropy".

predictions: предсказания модели.

targets: правильные значения (той же длины). Для перекрёстной энтропии это 0 или 1, а предсказания лежат между 0 и 1.

Выходные данные

Верните значение потерь как дробное число.

Ограничения

1 ≤ длина ≤ 1000

-1000 ≤ каждое значение ≤ 1000 (для перекрёстной энтропии 0 ≤ p ≤ 1 и t ∈ {0, 1})

Примеры

Пример 1
Ввод:
kind = "mse"
targets = [3.0, -0.5, 2.0]
predictions = [2.5, 0.0, 2.0]

Ожидаемый вывод:
expected = 0.166667
Ввод:
std::string kind = "mse";
std::vector<double> targets = {3.0, -0.5, 2.0};
std::vector<double> predictions = {2.5, 0.0, 2.0};

Ожидаемый вывод:
double expected = 0.166667;
Ввод:
string kind = "mse";
double[] targets = new double[] {3.0, -0.5, 2.0};
double[] predictions = new double[] {2.5, 0.0, 2.0};

Ожидаемый вывод:
double expected = 0.166667;

Пояснение

Квадраты ошибок: 0.5² = 0.25, 0.5² = 0.25 и 0² = 0. Их среднее равно 0.5 / 3 ≈ 0.166667.

Пример 2
Ввод:
kind = "binary_cross_entropy"
targets = [1.0, 0.0]
predictions = [0.9, 0.2]

Ожидаемый вывод:
expected = 0.164252
Ввод:
std::string kind = "binary_cross_entropy";
std::vector<double> targets = {1.0, 0.0};
std::vector<double> predictions = {0.9, 0.2};

Ожидаемый вывод:
double expected = 0.164252;
Ввод:
string kind = "binary_cross_entropy";
double[] targets = new double[] {1.0, 0.0};
double[] predictions = new double[] {0.9, 0.2};

Ожидаемый вывод:
double expected = 0.164252;

Пояснение

-(ln(0.9) + ln(1 - 0.2)) / 2 = -(-0.105361 - 0.223144) / 2 ≈ 0.164252. Уверенные правильные предсказания дают маленькие потери.

Как подступиться

Сначала попробуйте сами, затем открывайте подсказки по одной.

Подсказка 1

Каждая loss сравнивает predictions с targets поэлементно и затем усредняет ошибки по примерам.

Подсказка 2

Для cross-entropy ограничьте predictions вдали от 0 и 1 перед вычислением logarithms.

Подсказка 3

Помните, что absolute value и squaring — это не одно и то же, а cross-entropy использует target как weight для каждого log-term.

Ожидаемая сложность

время O(n), доп. память O(1)

Ссылки

Это задание адаптировано для CodeUtility. Следуйте условию и ограничениям выше.

Учитесь у других

Решения сообщества

Пока нет опубликованных решений. Решите задание, чтобы поделиться первым.