Problema
La entropía mide la incertidumbre de un conjunto de etiquetas: H(S) = -Σ pₖ × log₂(pₖ), donde pₖ es la proporción de etiquetas de la clase k. La ganancia de información es cuánto baja la entropía al dividir el conjunto por una variable:
IG = H(labels) - Σ (|Sᵥ| / |S|) × H(Sᵥ)
donde Sᵥ contiene las etiquetas de los ejemplos cuya variable vale v. Los árboles de decisión eligen la variable con la mayor ganancia.
Implementa information_gain(feature, labels).
Entrada
feature: El valor de la variable de cada ejemplo.
labels: La etiqueta de clase de cada ejemplo (misma longitud).
Salida
Devuelve la ganancia de información en bits, como número decimal.
Restricciones
1 ≤ longitud ≤ 10 000
Cada valor y etiqueta tiene de 1 a 20 caracteres
Ejemplos
Entrada:
labels = ["no", "no", "yes", "yes"]
feature = ["sunny", "sunny", "rain", "rain"]
Salida esperada:
expected = 1.0
Entrada:
std::vector<std::string> labels = {"no", "no", "yes", "yes"};
std::vector<std::string> feature = {"sunny", "sunny", "rain", "rain"};
Salida esperada:
double expected = 1.0;
Entrada:
string[] labels = new string[] {"no", "no", "yes", "yes"};
string[] feature = new string[] {"sunny", "sunny", "rain", "rain"};
Salida esperada:
double expected = 1.0;
Explicación
Las etiquetas son mitad yes y mitad no, así que H = 1 bit. Dividir por el clima da dos grupos puros (H = 0 cada uno), así que la ganancia es 1 - 0 = 1: la variable lo dice todo.
Entrada:
labels = ["yes", "yes", "no", "no"]
feature = ["a", "b", "a", "b"]
Salida esperada:
expected = 0.0
Entrada:
std::vector<std::string> labels = {"yes", "yes", "no", "no"};
std::vector<std::string> feature = {"a", "b", "a", "b"};
Salida esperada:
double expected = 0.0;
Entrada:
string[] labels = new string[] {"yes", "yes", "no", "no"};
string[] feature = new string[] {"a", "b", "a", "b"};
Salida esperada:
double expected = 0.0;
Explicación
Cada grupo a y b sigue teniendo un yes y un no (H = 1), así que el resto es 0.5 × 1 + 0.5 × 1 = 1 y la ganancia es 1 - 1 = 0: la variable no sirve.
Referencias
Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.