【发布时间】:2019-05-03 22:06:19
【问题描述】:
我目前正在研究 ID3 机器学习算法的初学者版本。我被困在如何递归地调用我的 build_tree 函数来实际制作决策树的其余部分并以良好的格式输出它。我已经计算了增益、熵、增益比等,但我不知道如何将递归集成到我的函数中。
给我一个数据集,在完成上述所有计算后,将其拆分为两个数据集。现在我需要能够递归地调用它,直到左右数据集都变成纯的[可以通过我编写的名为 dataset.is_pure() 的函数轻松检查],同时跟踪每个节点的阈值。我知道我所有的计算和拆分方法都在工作,因为我已经对它们进行了单独的测试。这只是我遇到麻烦的递归部分。
这是我做递归噩梦的 build_tree 函数。我目前正在使用 g++ 编译器在 linux 环境中工作。我现在拥有的代码可以编译,但是运行时会给我一个分段错误。任何和所有的帮助将不胜感激!
struct node
{
vector<vector<string>> data;
double atrb;
node* parent;
node* left = NULL;
node* right = NULL;
node(node* parent) : parent(parent) {}
};
node* root = new node(NULL);
void build_tree(node* current, dataset data_set)
{
vector<vector<string>> l_d;
vector<vector<string>> r_d;
double global_entropy = calc_entropy(data_set.get_col(data_set.n_col()-1));
int best_col = this->get_best_col(data_set, global_entropy);
hash_map selected_atrb(data_set.n_row(), data_set.truncate(best_col));
double threshold = get_threshold(selected_atrb, global_entropy);
cout << threshold << "\n";
split_data(threshold, best_col, data_set, l_d, r_d);
dataset right_data(r_d);
dataset left_data(l_d);
right_data.delete_col(best_col);
left_data.delete_col(best_col);
if(left_data.is_pure())
return;
else
{
node* new_left = new node(current);
new_left->atrb = threshold;
current->left = new_left;
new_left->data = l_d;
return build_tree(new_left, left_data);
}
if(right_data.is_pure())
return;
else
{
node* new_right = new node(current);
new_right->atrb = threshold;
current->right = new_right;
new_right->data = r_d;
return build_tree(new_right, right_data);
}
}
id3(dataset data)
{
build_tree(root, data);
}
};
这只是我课程的一部分。如果您想查看任何其他代码,请告诉我!
【问题讨论】:
-
这看起来不像java;它看起来像 C++。您确定您的问题标记正确吗?
-
@ErwinBolwidt 很抱歉。当我发布问题时大约是凌晨 3 点:/ 我已经更新了标签,感谢您指出!
标签: c++ linux algorithm recursion machine-learning