Деревья решений делят данные на как можно более чистые группы. Неоднородность Джини показывает, насколько перемешаны метки группы:
Gini = 1 - Σ pₖ²
где pₖ — доля меток класса k. У группы с одним классом неоднородность 0; у равной смеси двух классов — 0.5.
Реализуйте gini_impurity(labels).
Входные данные
labels: метки классов в группе.
Выходные данные
Верните неоднородность Джини как дробное число.
Ограничения
1 ≤ длина ≤ 10 000
Каждая метка — от 1 до 20 символов
Примеры
Ввод:
labels = ["yes", "yes", "no", "no"]
Ожидаемый вывод:
expected = 0.5
Ввод:
std::vector<std::string> labels = {"yes", "yes", "no", "no"};
Ожидаемый вывод:
double expected = 0.5;
Ввод:
string[] labels = new string[] {"yes", "yes", "no", "no"};
Ожидаемый вывод:
double expected = 0.5;
Пояснение
Половина — yes, половина — no: 1 - (0.5² + 0.5²) = 1 - 0.5 = 0.5, максимальная смешанность для группы из двух классов.
Ввод:
labels = ["cat", "cat", "cat"]
Ожидаемый вывод:
expected = 0.0
Ввод:
std::vector<std::string> labels = {"cat", "cat", "cat"};
Ожидаемый вывод:
double expected = 0.0;
Ввод:
string[] labels = new string[] {"cat", "cat", "cat"};
Ожидаемый вывод:
double expected = 0.0;
Пояснение
Только один класс: 1 - 1² = 0. Группа чистая.
Ссылки
Это задание адаптировано для CodeUtility. Следуйте условию и ограничениям выше.