Problema
A entropia mede a incerteza de um conjunto de rótulos: H(S) = -Σ pₖ × log₂(pₖ), onde pₖ é a fração de rótulos da classe k. O ganho de informação é quanto a entropia cai ao dividir o conjunto por uma variável:
IG = H(labels) - Σ (|Sᵥ| / |S|) × H(Sᵥ)
onde Sᵥ contém os rótulos dos exemplos cuja variável é v. As árvores de decisão escolhem a variável com o maior ganho.
Implemente information_gain(feature, labels).
Entrada
feature: O valor da variável de cada exemplo.
labels: O rótulo de classe de cada exemplo (mesmo tamanho).
Saída
Retorne o ganho de informação em bits, como número decimal.
Restrições
1 ≤ tamanho ≤ 10.000
Cada valor e rótulo tem de 1 a 20 caracteres
Exemplos
Entrada:
labels = ["no", "no", "yes", "yes"]
feature = ["sunny", "sunny", "rain", "rain"]
Saída esperada:
expected = 1.0
Entrada:
std::vector<std::string> labels = {"no", "no", "yes", "yes"};
std::vector<std::string> feature = {"sunny", "sunny", "rain", "rain"};
Saída esperada:
double expected = 1.0;
Entrada:
string[] labels = new string[] {"no", "no", "yes", "yes"};
string[] feature = new string[] {"sunny", "sunny", "rain", "rain"};
Saída esperada:
double expected = 1.0;
Explicação
Os rótulos são metade yes e metade no, então H = 1 bit. Dividir pelo clima dá dois grupos puros (H = 0 cada), então o ganho é 1 - 0 = 1: a variável diz tudo.
Entrada:
labels = ["yes", "yes", "no", "no"]
feature = ["a", "b", "a", "b"]
Saída esperada:
expected = 0.0
Entrada:
std::vector<std::string> labels = {"yes", "yes", "no", "no"};
std::vector<std::string> feature = {"a", "b", "a", "b"};
Saída esperada:
double expected = 0.0;
Entrada:
string[] labels = new string[] {"yes", "yes", "no", "no"};
string[] feature = new string[] {"a", "b", "a", "b"};
Saída esperada:
double expected = 0.0;
Explicação
Cada grupo a e b ainda tem um yes e um no (H = 1), então o restante é 0.5 × 1 + 0.5 × 1 = 1 e o ganho é 1 - 1 = 0: a variável é inútil.
Referências
Este desafio foi adaptado para o CodeUtility. Siga o enunciado e as restrições acima.