【发布时间】:2013-02-15 15:08:33
【问题描述】:
我正在使用 C4.5 algorithm 的略微修改版本在 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
这比为每个节点拥有一个独立的数据矩阵要少得多。
【问题讨论】:
-
在 C++ 中,总是在数组之前想到
std::vector。 -
@JoachimPileborg 是的,我几乎总是这样做,但我从未使用过向量向量,所以我不确定这是否是个好主意。
-
为什么不用C5.0算法?
-
@ÖöTiib 在我看来,C5 算法只是提高了一些内存效率,并没有真正生成比 C4.5 或它的前身 ID3 算法更好的决策树。
标签: c++ data-structures decision-tree