zoukankan      html  css  js  c++  java
  • [转载]简单易学的机器学习算法-决策树之ID3算的

    一、决策树分类算法概述

        决策树算法是从数据的属性(或者特征)出发,以属性作为基础,划分不同的类。例如对于如下数据集
    (数据集)
    其中,第一列和第二列为属性(特征),最后一列为类别标签,1表示是,0表示否。决策树算法的思想是基于属性对数据分类,对于以上的数据我们可以得到以下的决策树模型
    (决策树模型)
    先是根据第一个属性将一部份数据区分开,再根据第二个属性将剩余的区分开。
        实现决策树的算法有很多种,有ID3、C4.5和CART等算法。下面我们介绍ID3算法。

    二、ID3算法的概述

        ID3算法是由Quinlan首先提出的,该算法是以信息论为基础,以信息熵和信息增益为衡量标准,从而实现对数据的归纳分类。
        首先,ID3算法需要解决的问题是如何选择特征作为划分数据集的标准。在ID3算法中,选择信息增益最大的属性作为当前的特征对数据集分类。信息增益的概念将在下面介绍,通过不断的选择特征对数据集不断划分;
        其次,ID3算法需要解决的问题是如何判断划分的结束。分为两种情况,第一种为划分出来的类属于同一个类,如上图中的最左端的“非鱼类”,即为数据集中的第5行和第6行数据;最右边的“鱼类”,即为数据集中的第2行和第3行数据。第二种为已经没有属性可供再分了。此时就结束了。
        通过迭代的方式,我们就可以得到这样的决策树模型。
    (ID3算法基本流程)

    三、划分数据的依据

        ID3算法是以信息熵和信息增益作为衡量标准的分类算法。

    1、信息熵(Entropy)

       熵的概念主要是指信息的混乱程度,变量的不确定性越大,熵的值也就越大,熵的公式可以表示为:
    其中,为类别在样本中出现的概率。

    2、信息增益(Information gain)

       信息增益指的是划分前后熵的变化,可以用下面的公式表示:
    其中,表示样本的属性,是属性所有的取值集合。的其中一个属性值,的值为的样例集合。

    四、实验仿真

    1、数据预处理

        我们以下面的数据为例,来实现ID3算法:
    摘自 http://blog.sina.com.cn/s/blog_6e85bf420100ohma.html
    我们首先需要对数据处理,例如age属性,我们用0表示youth,1表示middle_aged,2表示senior等等。
    (将表格数据化)

    2、实验结果

    (原始的数据)
    (划分1)
    (划分2)
    (划分3)
    (最终的决策树)
    MATLAB代码
    主程序
    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. %% Decision Tree  
    2. % ID3  
    3.   
    4. %导入数据  
    5. %data = [1,1,1;1,1,1;1,0,0;0,1,0;0,1,0];    
    6.   
    7. data = [0,2,0,0,0;  
    8.     0,2,0,1,0;  
    9.     1,2,0,0,1;  
    10.     2,1,0,0,1;  
    11.     2,0,1,0,1;  
    12.     2,0,1,1,0;  
    13.     1,0,1,1,1;  
    14.     0,1,0,0,0;  
    15.     0,0,1,0,1;  
    16.     2,1,1,0,1;  
    17.     0,1,1,1,1;  
    18.     1,1,0,1,1;  
    19.     1,2,1,0,1;  
    20.     2,1,0,1,0];  
    21.   
    22. % 生成决策树  
    23. createTree(data);  

    生成决策树
    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. function [ output_args ] = createTree( data )  
    2.     [m,n] = size(data);  
    3.     disp('original data:');  
    4.     disp(data);  
    5.     classList = data(:,n);  
    6.     classOne = 1;%记录第一个类的个数  
    7.     for i = 2:m  
    8.         if classList(i,:) == classList(1,:)  
    9.             classOne = classOne+1;  
    10.         end  
    11.     end  
    12.       
    13.     % 类别全相同  
    14.     if classOne == m  
    15.         disp('final data: ');  
    16.         disp(data);  
    17.         return;  
    18.     end  
    19.       
    20.     % 特征全部用完  
    21.     if n == 1  
    22.         disp('final data: ');  
    23.         disp(data);  
    24.         return;  
    25.     end  
    26.       
    27.     bestFeat = chooseBestFeature(data);  
    28.     disp(['bestFeat: ', num2str(bestFeat)]);  
    29.     featValues = unique(data(:,bestFeat));  
    30.     numOfFeatValue = length(featValues);  
    31.       
    32.     for i = 1:numOfFeatValue  
    33.         createTree(splitData(data, bestFeat, featValues(i,:)));  
    34.         disp('-------------------------');  
    35.     end  
    36. end  

    选择信息增益最大的特征
    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. %% 选择信息增益最大的特征  
    2. function [ bestFeature ] = chooseBestFeature( data )  
    3.     [m,n] = size(data);% 得到数据集的大小  
    4.       
    5.     % 统计特征的个数  
    6.     numOfFeatures = n-1;%最后一列是类别  
    7.     % 原始的熵  
    8.     baseEntropy = calEntropy(data);  
    9.       
    10.     bestInfoGain = 0;%初始化信息增益  
    11.     bestFeature = 0;% 初始化最佳的特征位  
    12.       
    13.     % 挑选最佳的特征位  
    14.     for j = 1:numOfFeatures  
    15.         featureTemp = unique(data(:,j));  
    16.         numF = length(featureTemp);%属性的个数  
    17.         newEntropy = 0;%划分之后的熵  
    18.         for i = 1:numF  
    19.             subSet = splitData(data, j, featureTemp(i,:));  
    20.             [m_1, n_1] = size(subSet);  
    21.             prob = m_1./m;  
    22.             newEntropy = newEntropy + prob * calEntropy(subSet);  
    23.         end  
    24.           
    25.         %计算增益  
    26.         infoGain = baseEntropy - newEntropy;  
    27.           
    28.         if infoGain > bestInfoGain  
    29.             bestInfoGain = infoGain;  
    30.             bestFeature = j;  
    31.         end  
    32.     end  
    33. end  

    计算熵
    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. function [ entropy ] = calEntropy( data )  
    2.     [m,n] = size(data);  
    3.       
    4.     % 得到类别的项  
    5.     label = data(:,n);  
    6.       
    7.     % 处理完的label  
    8.     label_deal = unique(label);  
    9.       
    10.     numLabel = length(label_deal);  
    11.     prob = zeros(numLabel,2);  
    12.       
    13.     % 统计标签  
    14.     for i = 1:numLabel  
    15.         prob(i,1) = label_deal(i,:);  
    16.         for j = 1:m  
    17.             if label(j,:) == label_deal(i,:)  
    18.                 prob(i,2) = prob(i,2)+1;  
    19.             end  
    20.         end  
    21.     end  
    22.       
    23.     % 计算熵  
    24.     prob(:,2) = prob(:,2)./m;  
    25.     entropy = 0;  
    26.     for i = 1:numLabel  
    27.         entropy = entropy - prob(i,2) * log2(prob(i,2));  
    28.     end  
    29. end  

    划分数据
    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. function [ subSet ] = splitData( data, axis, value )  
    2.     [m,n] = size(data);%得到待划分数据的大小  
    3.       
    4.     subSet = data;  
    5.     subSet(:,axis) = [];  
    6.     k = 0;  
    7.     for i = 1:m  
    8.         if data(i,axis) ~= value  
    9.             subSet(i-k,:) = [];  
    10.             k = k+1;  
    11.         end  
    12.     end     
    13. end  
    原文链接是:http://blog.csdn.net/google19890102/article/details/28611225
  • 相关阅读:
    1373:鱼塘钓鱼(fishing)
    1261:【例9.5】城市交通路网
    1259:【例9.3】求最长不下降序列
    1260:【例9.4】拦截导弹(Noip1999)
    1258:【例9.2】数字金字塔
    1261:【例9.5】城市交通路网
    1260:【例9.4】拦截导弹(Noip1999)
    1259:【例9.3】求最长不下降序列
    1257:Knight Moves
    [HAOI2008]硬币购物(动态规划、容斥、搜索)
  • 原文地址:https://www.cnblogs.com/khunwang/p/3810267.html
Copyright © 2011-2022 走看看