我有一个如下数据集,
第1到6列
1.0000 0 0.9954 -0.0589 0.8524 0.02311.0000 0 1.0000 -0.1883 0.9304 -0.36161.0000 0 1.0000 -0.0336 1.0000 0.00491.0000 0 1.0000 -0.4516 1.0000 1.00001.0000 0 1.0000 -0.0240 0.9414 0.06531.0000 0 0.0234 -0.0059 -0.0992 -0.11951.0000 0 0.9759 -0.1060 0.9460 -0.2080 0 0 0 0 0 01.0000 0 0.9636 -0.0720 1.0000 -0.1433
我正在尝试使用二元分割构建决策树,其中一个问题是数据是连续的,而我的当前实现由于保持数据原样并进行分割而变得计算密集。如果你只是构建一个分类器,这可能还不算太糟糕。
在我的情况下,我正在进行十折交叉验证,并将分类器数量从5增加到50(装袋法)。我考虑使用分箱方法,将数据分成0.2的区间,但我意识到其中有负数。我使用Matlab进行实现。我是Matlab的新手,不确定是否有预定义的方法来处理这种情况。
回答:
不确定这是否完全解决了你的问题,但如果你的问题是动态定义“区间”,你可以这样做:
% 查找矩阵的最小值和最大值Mmin = min(M(:));Mmax = max(M(:));% 假设你有一个包含正负值的矩阵M,并希望将其分成0.2的区间buckets = Mmin:0.2:Mmax;% 或者假设你希望将它们均匀分布在固定数量的区间中,比如100buckets = linspace(Mmin,100,Mmax);
编辑:
假设你想根据某一列的值(比如第3列)来划分矩阵,你可以这样做:
% 将相关列定义为向量以便于处理v = M(:,3);% 假设你希望将它们均匀分布在固定数量的区间中,比如100buckets = linspace(min(v),100,max(v));% 现在查看每一行属于哪个区间bucket_idx = ones(size(v));for i = 2:length(buckets) bucket_idx(v>buckets(i-1)&(v<buckets(i)) = i;end
这会告诉你每一行属于哪个区间,虽然最好能将这个过程向量化,但目前这是我能想到的最快的解决方案。我认为一旦你知道每样东西属于哪个区间,你应该能够解决剩下的问题。