资源简介

实现ID3 决策树算法,并使用MATLAB自带的工具箱函数画出决策树,生成相应的规则

资源截图

代码片段和文件信息

function type=Classifier( PValue )
    global node child_value child_node_num
    [nodechild_valuechild_node_num]=ID3();
    n=1;        %从树的根结点(即node{1})开始查找
    k=1;
    while ~isempty(child_node_num{n})
        for i=1:length(child_value{n})
            if PValue(node{n})==child_value{n}(i)
                n=child_node_num{n}(i);
                break;
            end            
        end
        if i==length(child_value{n})
            % 若这个值在分类器中不存在,则取其最近的值进行分类
           PValue(node{n})=PValue(node{n})+0.1*k;
        end
        k=(-1)^k*( abs(k)+1 );
    end
    type=node{n};
end

% 函数返回一棵决策树
function  [nodechild_valuechild_node_num]=ID3()
    clear;
    clear global node child_value child_node_num;
    global node child_value child_node_num
    [SL SW PL PW CN]=textread(‘training data.txt‘‘%f %f %f %f %s‘);
    DValue=[SL SW PL PW];    %SL=DValue(:1)
    for i=1:length(SL)
        A(i)=i;
    end
    ClassPNum=[1 2 3 4];
    m=0;
    [nodechild_valuechild_node_num]=TreeNode( DValue CN A ClassPNumm ); 
end

% 生成树结点
% DValue--前四列数据
% A--参与划分的行号
% CN--属性值的集合(第5列数据)
% ClassPNum为划分的剩余属性编号
% 当前node的父亲结点为node{m}
function [nodechild_valuechild_node_num]=TreeNode( DValue CN A ClassPNumm)
    global node child_value child_node_num
    %ClassName={‘SL‘ ‘SW‘ ‘PL‘ ‘PW‘};
    n=length(node);
    if m>0
        %如果父亲结点存在,将本结点的序号存入父亲结点的子结点序号集中
        k=length(child_node_num{m});
        child_node_num{m}(k+1)=n+1;
    end
    % 1、样本为空,则树为空
    if isempty(DValue)
        node{ n+1 }=[];
        child_value{ n+1 }=[];
        child_node_num{ n+1 }=[];
        return;
    end 
    % 2、用于划分的剩余属性为空,选择多数元组所在的类作为结点
    if isempty( ClassPNum ) 
       node{ n+1 }=find_most( CNA );
       child_value{ n+1 }=[];
       child_node_num{ n+1 }=[];
       return;
    end 
    % 3、样本中所有数据都属于同一类,将此类作为结点
    CNRowNum=CN_sta( CN A);
    if length( find(CNRowNum==0) )>=2
        node{ n+1 }=CN{A(1)};
        child_value{ n+1 }=[];
        child_node_num{ n+1 }=[];
        return;
    % 4、样本中所有数据不属于同一类
    else
        I=Exp( CNA );
        for i=1:length( ClassPNum )            
            Entropy(i)=avg_entropy( DValue(:ClassPNum(i)) A CN);
            Gain(i)=I-Entropy(i);
        end
        % 4.1、各属性的信息增益均小于0,选择多数元组所在的类作为结点
        if max(Gain)<=0
            node{ n+1 }=find_most( CNA );
            child_value{ n+1 }=[];
            child_node_num{ n+1 }=[];
        return;
        % 4.2、在信息增益最大的属性上进行划分
        else
            maxG=find( Gain==max(Gain) );
            [PValue RowNum]=type_sta( DValue(:ClassPNum(maxG(1))) A );
            node{ n+1 }=ClassPNum(maxG(1));
            child_value{ n+1 }=PValue;
            child_node_num{ n+1 }=[];
            ClassPNum(maxG)=[];     % 删除ClassPNum(maxG)--已经进行划分的属性
            for i=1:length(PValue)
                [nodechild_valuechild_node_num]=TreeNode( DValue CN RowNum{i} ClassPNum

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       5297  2014-05-07 21:16  Classifier.m

----------- ---------  ---------- -----  ----

                 5297                    1


评论

共有 条评论