/** * @param MultipleTreeNode $node * @param $branch_name * @param array $training_data */ private function split_node(MultipleTreeNode $node, $branch_name, $training_data) { $samples = $training_data['samples']; $header = $training_data['header']; $value_count = ArrayService::count_values($samples, $this->base_key); if (count($value_count) === 1) { $node->children[$branch_name] = new MultipleTreeNode(strtoupper(key($value_count))); return; } $splitting_attribute = $max_gain = null; foreach (array_keys($header) as $h) { $g = $this->get_information_gain($samples, $h); if ($max_gain === null || $g > $max_gain) { $max_gain = $g; $splitting_attribute = $h; } } if ($node->getData() !== null) { $node->children[$branch_name] = new MultipleTreeNode($splitting_attribute); $node = $node->children[$branch_name]; } else { $node->setData($splitting_attribute); } $value_count = ArrayService::count_values($samples, $splitting_attribute); foreach ($value_count as $value_name => $count) { $subset = ArrayService::create_subset($training_data, $splitting_attribute, $value_name); $this->split_node($node, $value_name, $subset); } return; }