Problema
Un clasificador multiclase devuelve una probabilidad por clase (por ejemplo, con softmax). La entropía cruzada categórica lo penaliza cuando da una probabilidad baja a la clase correcta:
loss = -(ln(p₁) + ln(p₂) + … + ln(pₙ)) / n
donde pᵢ es la probabilidad que el modelo dio a la clase correcta del ejemplo i. Para evitar ln(0), primero sube cualquier probabilidad menor que 0.0000001 a 0.0000001.
Implementa categorical_cross_entropy(probabilities, labels).
Entrada
probabilities: Una fila por ejemplo, con una probabilidad por clase.
labels: El índice de la clase correcta de cada ejemplo (empezando en 0).
Salida
Devuelve la pérdida promedio como número decimal.
Restricciones
1 ≤ ejemplos ≤ 1000, 2 ≤ clases ≤ 100
0 ≤ cada probabilidad ≤ 1
0 ≤ labels[i] < número de clases
Ejemplos
Entrada:
labels = [0, 1]
probabilities = [
[0.7, 0.2, 0.1],
[0.1, 0.8, 0.1]
]
Salida esperada:
expected = 0.289909
Entrada:
std::vector<long long> labels = {0, 1};
std::vector<std::vector<double>> probabilities = {
{0.7, 0.2, 0.1},
{0.1, 0.8, 0.1}
};
Salida esperada:
double expected = 0.289909;
Entrada:
long[] labels = new long[] {0, 1};
double[][] probabilities = new double[][] {
new double[] {0.7, 0.2, 0.1},
new double[] {0.1, 0.8, 0.1}
};
Salida esperada:
double expected = 0.289909;
Explicación
Las clases correctas recibieron 0.7 y 0.8: -(ln(0.7) + ln(0.8)) / 2 = -(-0.356675 - 0.223144) / 2 ≈ 0.289909.
Entrada:
labels = [1]
probabilities = [
[1.0, 0.0]
]
Salida esperada:
expected = 16.118096
Entrada:
std::vector<long long> labels = {1};
std::vector<std::vector<double>> probabilities = {
{1.0, 0.0}
};
Salida esperada:
double expected = 16.118096;
Entrada:
long[] labels = new long[] {1};
double[][] probabilities = new double[][] {
new double[] {1.0, 0.0}
};
Salida esperada:
double expected = 16.118096;
Explicación
La clase correcta recibió probabilidad 0, que se sube a 0.0000001, así que la pérdida es -ln(0.0000001) ≈ 16.118096: una respuesta incorrecta dada con seguridad se castiga con dureza.
Referencias
Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.