0

再帰を使用して決定木を実装しようとしています。これまでのところ、次のように記述しています。

  1. 与えられたデータセットから、最適な分割を見つけて分岐を返します。詳細を与えるために、行列の列として特徴を持つデータがあり、最後の列がデータのクラス1、-1を示しているとします。
  2. 1に基づいています。分割するのに最適な機能があり、その分割の下にあるブランチと一緒に分割します。たとえば、情報ゲインに基づいて、機能9が最適な分割であり、機能9の一意の値{1,3,5}は9
  3. 各ブランチに関連するデータを取得する方法を理解しました。次に、各ブランチのデータを反復処理して、次の分割セットを取得する必要があります。この再帰を理解するのに苦労しています。

これが私がこれまでに持っているコードです、私が今している再帰は正しく見えません:どうすればこれを修正できますか?

function [indeces_of_node, best_split] = split_node(X_train, Y_train)

    %cell to save split information
    feature_to_split_cell = cell(size(X_train,2)-1,4);

    %iterate over features
    for feature_idx=1:(size(X_train,2) - 1)
        %get current feature
        curr_X_feature = X_train(:,feature_idx);

        %identify the unique values
        unique_values_in_feature = unique(curr_X_feature);

        H = get_entropy(Y_train); %This is actually H(X) in slides
        %temp entropy holder

        %Storage for feature element's class
        element_class = zeros(size(unique_values_in_feature,1),2);

        %conditional probability H(X|y)
        H_cond = zeros(size(unique_values_in_feature,1),1); 

        for aUnique=1:size(unique_values_in_feature,1)
            match = curr_X_feature(:,1)==unique_values_in_feature(aUnique);
            mat = Y_train(match);
            majority_class = mode(mat);
            element_class(aUnique,1) = unique_values_in_feature(aUnique);
            element_class(aUnique,2) = majority_class;
            H_cond(aUnique,1) = (length(mat)/size((curr_X_feature),1)) * get_entropy(mat);
        end

        %Getting the information gain
        IG = H - sum(H_cond);

        %Storing the IG of features
        feature_to_split_cell{feature_idx, 1} = feature_idx;
        feature_to_split_cell{feature_idx, 2} = max(IG);
        feature_to_split_cell{feature_idx, 3} = unique_values_in_feature;
        feature_to_split_cell{feature_idx, 4} = element_class;
    end
    %set feature to split zero for every fold
    feature_to_split = 0;

    %getting the max IG of the fold
    max_IG_of_fold = max([feature_to_split_cell{:,2:2}]);

    %vector to store values in the best feature
    values_of_best_feature = zeros(size(15,1));

    %Iterating over cell to get get the index and the values under best
    %splited feature.
    for i=1:length(feature_to_split_cell)
        if (max_IG_of_fold == feature_to_split_cell{i,2});
            feature_to_split = i;
            values_of_best_feature = feature_to_split_cell{i,4};
        end
    end
    display(feature_to_split)
    display(values_of_best_feature(:,1)')

    curr_X_feature = X_train(:,feature_to_split);

    best_split = feature_to_split
    indeces_of_node = unique(curr_X_feature)

    %testing
    for k = 1 : length(values_of_best_feature)
        % Condition to stop the recursion, if clases are pure then we are
        % done splitting, if both classes have save number of attributes
        % then we are done splitting.
        if (sum(values_of_best_feature(:,2) == -1) ~= sum(values_of_best_feature(:,2) == 1))
            if((sum(values_of_best_feature(:,2) == -1) ~= 0) || (sum(values_of_best_feature(:,2) == 1) ~= 0))
                mat1 = X_train(X_train(:,5)== values_of_best_feature(k),:);
                [indeces_of_node, best_split] = split_node(mat1, Y_train);
            end
        end
    end
end

これが私のコードの外です:そして私の再帰のいくつかのように見えます私は1つのブランチの深さだけに行き、その後は残りのブランチに戻ることはありません

feature_to_split =

     5


ans =

     1     2     3     4     5     6     7     8     9


feature_to_split =

     9


ans =

     3     5     7     8    11


feature_to_split =

    21


feature_to_split =

    21


feature_to_split =

    21


feature_to_split =

    21

このコードの実行に興味がある場合:git

4

1 に答える 1

0

複数回のデバッグの後、答えを見つけました。誰かがこれから恩恵を受けることを願っています:

for k = 1 : length(values_of_best_feature)
    % Condition to stop the recursion, if clases are pure then we are
    % done splitting, if both classes have save number of attributes
    % then we are done splitting.
    if((sum(values_of_best_feature(:,2) == -1) ~= 0) || (sum(values_of_best_feature(:,2) == 1) ~= 0))
        X_train(:,feature_to_split) = [];
        mat1 = X_train(X_train(:,5)== values_of_best_feature(k),:);
        %if(level >= curr_level)
        split_node(mat1, Y_train, 1, 2, level-1);
        %end
    end

end
return;
于 2012-10-30T05:40:38.270 に答える