我正在用 C 编写决策树的代码。现在它给了我正确的结果(0% 的训练错误,低测试错误),但是运行需要很长时间。
问题在于我运行 qsort 的频率。我的基本算法是这样的:
for every feature
sort that feature column using qsort
remove duplicate feature values in that column
for every unique feature value
split
determine entropy given that split
save the best feature to split + split value
for every training_example
if training_example's value for best feature < best split value, store in Left[]
else store in Right[]
recursively call this function, using only the Left[] training examples
recursively call this function, using only the Right[] training examples
因为最后两行是迭代调用,并且因为树可以扩展到几十个分支,所以对 qsort 的调用数量是巨大的(特别是对于我的数据集具有 > 1000 个特征)。
我减少运行时间的想法是创建一个二维数组(在一个单独的函数中),其中每一列都是一个排序的特征列。然后,只要我为每个递归调用在 Left[] 和 Right[] 中维护训练示例的行号向量,我就可以调用这个单独的函数,在预排序的特征向量中获取我想要的行,并节省每次必须进行 qsort 的成本。
我对C相当陌生,所以我不确定如何编写代码。在 MatLab 中,我可以拥有一个任何函数都可以更改或访问的全局数组,在 C 中寻找类似的东西。