示例#1
0
 /**
  * @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;
 }