资源简介

matlab算法应用 数据挖掘课程中用决策树算法进行天气预测

资源截图

代码片段和文件信息

function type=id3( 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;%从工作空间清除指定的全局变量node child_value child_node_num
    global node child_value child_node_num%将变量node child_value child_node_num定义成全局变量
    [SL SW PL PW CN]=textread(‘traint .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)%DValue为空阵列时isempty(DValue)=1否则返回0
        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(P

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        5462  2012-11-28 22:41  天气预测\id3.m
     文件        2284  2012-11-28 22:42  天气预测\mymain.m
     文件       25960  2012-11-29 10:15  天气预测\traint .txt
     目录           0  2012-12-10 09:17  天气预测\

评论

共有 条评论