我正在使用稍微修改过的C4.5 算法版本在 C++ 中编写决策树。每个节点代表数据集的一个属性或一列,并且每个可能的属性值都有一个子节点。
我的问题是如何存储训练数据集,记住我必须为每个节点使用一个子集,所以我需要一种快速方法来只选择行和列的子集。
主要目标是尽可能以尽可能高的内存和时间效率(按优先级顺序)进行操作。
我认为最好的方法是拥有一个数组数组(或 std::vector)或类似的东西,并且每个节点都有一个列表(数组,向量等)或带有column,line
(可能是元组)对的东西对该节点有效。
我现在应该有更好的方法来做到这一点,有什么建议吗?
更新:我需要的是这样的:
一开始我有这个数据:
Paris 4 5.0 True
New York 7 1.3 True
Tokio 2 9.1 False
Paris 9 6.8 True
Tokio 0 8.4 False
但对于第二个节点,我只需要这些数据:
Paris 4 5.0
New York 7 1.3
Paris 9 6.8
对于第三个节点:
Tokio 2 9.1
Tokio 0 8.4
但是有一个包含数百万条记录的表,最多有数百列。
我想到的是将所有数据保存在一个矩阵中,然后为每个节点保存当前列和行的信息。像这样的东西:
Paris 4 5.0 True
New York 7 1.3 True
Tokio 2 9.1 False
Paris 9 6.8 True
Tokio 0 8.4 False
节点 2:
columns = [0,1,2]
rows = [0,1,3]
节点 3:
columns = [0,1,2]
rows = [2,4]
这样在最坏的情况下我只能浪费
size_of(int) * (number_of_columns + number_of_rows) * node
这比为每个节点拥有一个独立的数据矩阵要少得多。