ID3决策树算法是基于信息增益来构建的,信息增益可以由训练集的信息熵算得,这里举一个简单的例子

data=[心情好 天气好  出门

心情好 天气不好 出门

心情不好 天气好 出门

心情不好 天气不好 不出门]

前面两列是分类属性,最后一列是分类

分类的信息熵可以计算得到:
出门=3,不出门=1,总行数=4
分类信息熵 = -(3/4)*log2(3/4)-(1/4)*log2(1/4)

第一列属性有两类,心情好,心情不好

心情好 ,出门=2,不出门=0,行数=2

心情好信息熵=-(2/2)*log2(2/2)+(0/2)*log2(0/2)

同理

心情不好信息熵=-(1/2)*log2(1/2)-(1/2)*log2(1/2)

心情的信息增益=分类信息熵 - 心情好的概率*心情好的信息熵 - 心情不好的概率*心情不好的信息熵


由此可以得到每个属性对应的信息熵,信息熵最大的即为最优划分属性。

还是这个例子,加入最优划分属性为心情

然后分别在心情属性的每个具体情况下的分类是否全部为同一种,若为同一种则该节点标记为此类别,

这里我们在心情好的情况下不管什么天气结果都是出门所以,有了

心情不好的情况下有不同的分类结果,继续计算在心情不好的情况下,其它属性的信息增益,

把信息增益最大的属性作为这个分支节点,这个我们只有天气这个属性,那么这个节点就是天气了,

天气属性有两种情况,如下图

在心情不好并且天气好的情况下,若分类全为同一种,则改节点标记为此类别

有训练集可以,心情不好并且天气好为出门,心情不好并且天气不好为不出门,结果入下图

对于分支节点下的属性很有可能没有数据,比如,我们假设训练集变成

data=[心情好 晴天  出门

心情好 阴天 出门

心情好 雨天 出门

心情好 雾天 出门

心情不好 晴天 出门

心情不好 雨天 不出门

心情不好 阴天 不出门]

如下图:

在心情不好的情况下,天气中并没有雾天,我们如何判断雾天到底是否出门呢?我们可以采用该样本最多的分类作为该分类,
这里天气不好的情况下,我们出门=1,不出门=2,那么这里将不出门,作为雾天的分类结果

在此我们所有属性都划分了,结束递归,我们得到了一颗非常简单的决策树。

下面附上我的实现ID3决策树算法代码:(octave/matlab,该程序本人已经验证过可以执行且结果正确,这里属性集我偷了一个懒,

没有标识出具体属性名,我是使用矩阵中的列号)

著名的还有C4.5决策树算法,它是ID3的改进,作者都是同一个人,罗斯昆兰

%生成决策树ID3算法
%data:训练集
%feature:属性集
function [node] =createTree(data,feature)type=mostType(data);[m,n]=size(data);%生成节点node%value:分类结果,若为null则表示该节点是分支节点%name:节点划分属性%type:节点属性值%children:子节点node=struct('value','null','name','null','type','null','children',[]);temp_type=data(1,n);temp_b=true;for i=1:mif temp_type!=data(i,n)temp_b=false;endend%样本中全为同一分类结果,则node节点为叶子节点if temp_b==truenode.value=data(1,n);return;end%属性集合为空,将结果标记为样本中最多的分类if sum(feature)==0node.value=type;return;endfeature_bestColumn=bestFeature(data);best_feature=getData()(:,feature_bestColumn);best_distinct=unique(best_feature);best_num=length(best_distinct);best_proc=zeros(best_num,2);best_proc(:,1)=best_distinct(:,1);%循环该属性的每一个值for i=1:best_numDv=[];Dv_index=1;%为node创建一个bach_node分支,设样本data中改属性值为best_proc(i,1)的集合为Dvbach_node=struct('value','null','name','null','type','null','children',[]);for j=1:mif best_proc(i,1)==data(j,feature_bestColumn)Dv(Dv_index,:)=data(j,:);Dv_index=Dv_index+1;endend%Dv为空则将结果标记为样本中最多的分类if length(Dv)==0bach_node.value=type;bach_node.type=best_proc(i,1);bach_node.name=feature_bestColumn;node.children(i)=bach_node;return;elsefeature(feature_bestColumn)=0;%递归调用createTree方法bach_node=createTree(Dv,feature);bach_node.type=best_proc(i,1);bach_node.name=feature_bestColumn;node.children(i)=bach_node;endend
end%获取最优划分属性
function [column] = bestFeature(data)[m,n]=size(data);featureSize=n-1;gain_proc=zeros(featureSize,2);entropy=getEntropy(data);for i=1:featureSizegain_proc(i,1)=i;gain_proc(i,2)=getGain(entropy,data,i);endfor i=1:featureSizeif gain_proc(i,2)==max(gain_proc(:,2))column=i;break;endend
end%计算样本最多的结果
function [res] = mostType(data)[m,n]=size(data);res_distinct = unique(data(:,n));res_proc = zeros(length(res_distinct),2);res_proc(:,1)=res_distinct(:,1);for i=1:length(res_distinct)for j=1:mif res_proc(i,1)==data(j,n)res_proc(i,2)=res_proc(i,2)+1;endendendfor i=1:length(res_distinct)if res_proc(i,2)==max(res_proc(:,2))res=res_proc(i,1);break;endend
end%计算信息熵
function [entropy] = getEntropy(data)entropy=0;[m,n]=size(data);label=data(:,n);label_distinct=unique(label);label_num=length(label_distinct);proc=zeros(label_num,2);proc(:,1)=label_distinct(:,1);for i=1:label_numfor j=1:mif proc(i,1)==data(j,n)proc(i,2)=proc(i,2)+1;endendproc(i,2)=proc(i,2)/m;endfor i=1:label_numentropy=entropy-proc(i,2)*log2(proc(i,2));end
end%计算信息增益
function [gain] = getGain(entropy,data,column)[m,n]=size(data);feature=data(:,column);feature_distinct=unique(feature);feature_num=length(feature_distinct);feature_proc=zeros(feature_num,2);feature_proc(:,1)=feature_distinct(:,1);f_entropy=0;for i=1:feature_numfeature_data=[];feature_proc(:,2)=0;feature_row=1;for j=1:mif feature_proc(i,1)==data(j,column)feature_proc(i,2)=feature_proc(i,2)+1;endif feature_distinct(i,1)==data(j,column)feature_data(feature_row,:)=data(j,:);feature_row=feature_row+1;endendf_entropy=f_entropy+feature_proc(i,2)/m*getEntropy(feature_data);endgain=entropy-f_entropy;

    

转载于:https://www.cnblogs.com/yifengjianbai/p/8873498.html

机器学习-ID3决策树算法(附matlab/octave代码)相关推荐

  1. 浅谈决策树算法以及matlab实现ID3算法

    决策树方法在分类.预测.规则提取等领域有着广泛的应用.在20世纪70年代后期和80年代初期,机器学习研究者J.Ross Quinilan提出了ID3算法以后,决策树在机器学习.数据挖掘领域得到极大的发 ...

  2. python机器学习笔记:ID3决策树算法实战

    ID3算法是一种贪心算法,用来构造决策树,ID3算法起源于概念学习系统(CLS),以信息熵的下降速度为选取测试属性的标准,即在每一个节点选取还尚未被用来划分的具有最高信息增益的属性作为划分标准,然后继 ...

  3. 机器学习:决策树算法(ID3算法)的理解与实现

    机器学习:决策树算法(ID3算法)的理解与实现 文章目录 机器学习:决策树算法(ID3算法)的理解与实现 1.对决策树算法的理解 1.概述 2.算法难点 选择最优划分属性 1.信息熵 2.信息增益 2 ...

  4. 在西瓜数据集上用Python实现ID3决策树算法完整代码

    在西瓜数据集上用Python实现ID3决策树算法完整代码 文章目录 1.决策树算法代码ID3.py 2.可视化决策树代码visual_decision_tree.py 3.贴几张运行结果图 1.生成的 ...

  5. python决策树实例_Python机器学习之决策树算法实例详解

    本文实例讲述了Python机器学习之决策树算法.分享给大家供大家参考,具体如下: 决策树学习是应用最广泛的归纳推理算法之一,是一种逼近离散值目标函数的方法,在这种方法中学习到的函数被表示为一棵决策树. ...

  6. 机器学习笔记(4)——ID3决策树算法及其Python实现

    决策树是一种基于树结构来进行决策的分类算法,我们希望从给定的训练数据集学得一个模型(即决策树),用该模型对新样本分类.决策树可以非常直观展现分类的过程和结果,一旦模型构建成功,对新样本的分类效率也相当 ...

  7. 【MATLAB】机器学习:决策树算法实验

    实验内容 1 使用决策数实现西瓜数据集2.0的分类(随机十次的结果取平均): 2 使用决策数实现鸢尾花的分类(随机十次的结果取平均) : 3 画出十次实验的精度变化曲线图. 实验代码 %%****** ...

  8. 【机器学习】Decision Tree 决策树算法详解 + Python代码实战

    文章目录 一.直观理解决策树 二.熵的作用 三.信息增益 四.决策树构造实例 4.1 问题描述 4.2 根节点构造 五.信息增益率和GINI系数 5.1 信息增益存在的问题 5.2 信息增益率 5.3 ...

  9. 机器学习算法——决策树算法详细介绍,并使用sklearn实现案例预测,可视化决策树

    目录 一.决策树算法简介 二.决策树分类原理 1.熵 1.1 概念 1.2 案例 2.决策树的划分依据一:信息增益 2.1 概念 2.2 案例: 3.决策树的划分依据二:信息增益率 3.1 概念 3. ...

最新文章

  1. 杀死linux-zombie僵尸进程
  2. 深度学习在美团的应用
  3. 优动漫PAINT核心功能介绍
  4. 【软件工程第三次作业】
  5. element 输入框点击事件_Element Input输入框的使用方法
  6. 计算机论文格式要求吗,计算机论文格式(写作要求详细介绍)
  7. 最新彩虹DS仿小储云模板源码
  8. 三大开源bi工具_Power BI与同类工具对比,行业应用该选谁?
  9. IP信息解析和地理定位,以及免费GeoLite2-City.mmdb的使用教程
  10. Hive字符串函数-空格处理
  11. GitHub新手使用教学(从安装到使用)
  12. 新锐领袖之力——中国时尚达人李磊受邀参加balmain 2022秋冬大秀
  13. 手把手带你实现 Docker 部署 Redis 集群
  14. 用矩形法求定积分,分别求sin x dx ,cos x dx,e exp x;
  15. python画超长图-python实现按长宽比缩放图片
  16. 论文阅读—图像分割方法综述(二)(arXiv:[cs:cv]20200410)
  17. 信息流广告文案与创意设计
  18. 红米2a手机出现android,红米2A的手机系统是什么?红米2A能升级安卓5.0吗?
  19. 控制台报错:Unknown database ‘xxxxx‘
  20. 01-如何写SCI论文

热门文章

  1. C++新特性探究(18.2):C++11 unique_ptr智能指针详解
  2. 视觉SLAM——英特尔D435i相机内参矩阵标定
  3. matlab 开采沉陷 何,MATLAB在开采沉陷预计可视化中的应用
  4. python安装pyqt5 qml_用 PyQt5 和 QML 做了个小工具,,感觉 PyQt 和 QML 的交互比较繁琐...
  5. oracle 空值的排序问题 (转载),sqlserver、oracle数据库排序空值null问题解决办法
  6. pytorch 池化
  7. 19 Signals and Signal Handling
  8. java junit
  9. opencv fast角检测
  10. 一分钟,六张图让您看懂Linux系统对程序员的重要性。