写在前面的话

如果您有任何地方看不懂的,那一定是我写的不好,请您告诉我,我会争取写的更加简单易懂!

如果您有任何地方看着不爽,请您尽情的喷,使劲的喷,不要命的喷,您的槽点就是帮助我要进步的地方!

计算给定数据的信息熵

在决策树算法中最重要的目的我们已经在前几章说过了,就是根据信息论的方法找到最合适的特征来划分数据集。在这里,我们首先要计算所有类别的所有可能值的香农熵,根据香农熵来我们按照取最大信息增益(information gain)的方法划分我们的数据集。


我们的数据集如下表所示:

根据这张表,我们使用python来构建我们的数据集。

#!/usr/bin/env python
# coding=utf-8
# author: chicho
# running: python trees.py
# filename : trees.pydef createDataSet():dataSet = [[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,1,'no']] # 我们定义了一个list来表示我们的数据集,这里的数据对应的是上表中的数据labels = ['no surfacing','flippers']return dataSet, labels

其中第一列的1表示的是不需要浮出水面就可以生存的,0则表示相反。 第二列同样是1表示有脚蹼,0表示的是没有。

在构建完数据集之后我们需要计算数据集的香农熵。
根据香农熵的定义可以知道:

根据这个公式我们来编写相应的代码。(注意:我们是计算每个类别的香农熵,也就是鱼类还是非鱼类的香农熵。在这我们的数据集当中我们用’yes’表示是鱼类,用‘no’表示非鱼类)

# 代码功能:计算香农熵
from math import log #我们要用到对数函数,所以我们需要引入math模块中定义好的log函数(对数函数)def calcShannonEnt(dataSet):#传入数据集
# 在这里dataSet是一个链表形式的的数据集countDataSet = len(dataSet) # 我们计算出这个数据集中的数据个数,在这里我们的值是5个数据集labelCounts={} # 构建字典,用键值对的关系我们表示出 我们数据集中的类别还有对应的关系for featVec in dataSet: 通过for循环,我们每次取出一个数据集,如featVec=[1,1,'yes']currentLabel=featVec[-1] # 取出最后一列 也就是类别的那一类,比如说‘yes’或者是‘no’if currentLabel not in labelCounts.keys():labelCounts[currentLabel] = 0labelCounts[currentLabel] += 1print labelCounts # 最后得到的结果是 {'yes': 2, 'no': 3}shannonEnt = 0.0 # 计算香农熵, 根据公式for key in labelCounts:prob = float(labelCounts[key])/countDataSetshannonEnt -= prob * log(prob,2)return shannonEnt

在python中我们使用 a=[]来定义一格list,我们使用a={}来定义一个字典。
例如:
website = {1:“google”,“second”:“baidu”,3:“facebook”,“twitter”:4}

>>>#用d.keys()的方法得到dict的所有键,结果是list
>>> website.keys()
[1, 'second', 3, 'twitter']

注意是d.keys()

>>>#用d.values()的方法得到dict的所有值,如果里面没有嵌套别的dict,结果是list
>>> website.values()
['google', 'baidu', 'facebook', 4]>>>#用items()的方法得到了一组一组的键值对,
>>>#结果是list,只不过list里面的元素是元组
>>> website.items()
[(1, 'google'), ('second', 'baidu'), (3, 'facebook'), ('twitter', 4)]

接下来我们来测试一下,通过 reload来测试

>>> import trees
>>> reload(trees)
<module 'trees' from 'trees.pyc'>
>>> myDat,labels = trees.createDataSet()
>>> myDat
[[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
>>> labels
['no surfacing', 'flippers']
>>> trees.calcShannonEnt(myDat)
{'yes': 2, 'no': 3}
0.9709505944546686
>>>

我们贴出实验的完整代码:

#!/usr/bin/env python
# coding=utf-8
# author: chicho
# running: python trees.py
# filename : trees.py
from math import logdef createDataSet():dataSet = [[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,1,'no']]labels = ['no surfacing','flippers']return dataSet, labelsdef calcShannonEnt(dataSet):countDataSet = len(dataSet)labelCounts={}for featVec in dataSet:currentLabel=featVec[-1]if currentLabel not in labelCounts.keys():labelCounts[currentLabel] = 0labelCounts[currentLabel] += 1print labelCountsshannonEnt = 0.0for key in labelCounts:prob = float(labelCounts[key])/countDataSetshannonEnt -= prob * log(prob,2)return shannonEnt

我们再把计算的过程总结一下,方便大家理解:

1.计算数据集中实例的总是,也就是样本的总数。我们把这个值保存成一格单独的变量以便之后方便使用,提高代码的效率
2.创建字典,用于保存类别信息。在整个数据集当中有多少个类别,每个类别的个数是多少
3. 在我们创建的数据字典中,它的键是我们数据集中最后一列的值。如果当前键不存在则把这个键加入到字典当中,依次统计出现类别的次数
4. 最后使用所有类标签对应的次数来计算它们的概论
5.计算香农熵


香农熵越高,则说明混合的数据越多,我们可以在数据集当中添加更多的分类,来观察一下熵是怎么变化的。

>>> myDat[0][-1]='maybe'
>>> myDat
[[1, 1, 'maybe'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
>>> trees.calcShannonEnt(myDat)
{'maybe': 1, 'yes': 1, 'no': 3}
1.3709505944546687
>>> 

对比一下可以发现熵增加了:

得到熵之后我们就可以按照获取最大信息增益的方法划分数据集。


写在后面的话

要么就不做,要做就做最好


无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程 https://www.cbedai.net/chichoxian

或者你也可以直接,嘤嘤嘤嘤,爱你们哟~~~~~比心比心~~~

决策树算法(三)——计算香农熵相关推荐

  1. 决策树算法计算过程举例

    参考: https://www.cnblogs.com/feiyumo/p/9284490.html 一.ID3算法 "信息熵"是度量样本集合不确定度(纯度)的最常用的指标. 在我 ...

  2. Python机器学习(三)--决策树算法

    Python机器学习(三)--决策树算法 原创  2014年07月14日 13:57:55

  3. 三个有名的决策树算法:CHAID、CART和C4.5

    三个有名的决策树算法:CHAID.CART和C4.5 CHAID.CART和C4.5大概是决策树算法丛林中最有名,商业上运用也也最成功的算法了.CHAID (chi-squared automatic ...

  4. 机器学习实战--决策树算法

    决策树 决策树(decision tree)是一种基本的分类与回归方法.从判断模块引出的左右箭头称为分支,它可以达到另外一个判断模块或者终止模块.分类决策树模型是一种描述对实例进行分类的树形结构.决策 ...

  5. 使用决策树算法预测西瓜的好坏

    文章目录 1.决策树简介 2.西瓜数据集的ID3算法实现 2.1.ID3算法简介 2.2.建立决策树 2.2.1.步骤 2.2.2.代码实现 3.西瓜数据集的C4.5算法实现 3.1.C4.5算法简介 ...

  6. c4.5决策树算法python_Python3实现机器学习经典算法(四)C4.5决策树

    一.C4.5决策树概述 C4.5决策树是ID3决策树的改进算法,它解决了ID3决策树无法处理连续型数据的问题以及ID3决策树在使用信息增益划分数据集的时候倾向于选择属性分支更多的属性的问题.它的大部分 ...

  7. 一步步教你轻松学决策树算法

    一步步教你轻松学决策树算法 (白宁超 2018年8月27日16:28:53) 导读:决策树算法是一种基本的分类与回归方法,是最经常使用的算法之一.决策树模型呈树形结构,在分类问题中,表示基于特征对实例 ...

  8. 机器学习算法之决策树算法

    决策树 综述 决策树(Decision Tree)算法是一种基本的分类与回归方法,根据数据的属性采用树状结构建立决策模型.决策树模型常常用来解决分类和回归问题.常见的算法包括CART(Classifi ...

  9. 机器学习——决策树算法

    文章目录 一.决策树介绍 二.利用信息增益选择最优划分属性 三.ID3代码实现 1.jupyter下python实现 2. 使用sklearn实现ID3 四.C4.5算法实现 五.CART算法实现 六 ...

最新文章

  1. Udacity机器人软件工程师课程笔记(二十七) - 卷积神经网络(CNN)
  2. MySQL如何判别InnoDB表是独立表空间还是共享表空间
  3. 数据库收缩数据文件的尝试(二)(r11笔记第9天)
  4. golang panic和recover 捕获异常
  5. python好还是c+-JAVA,Python和C+各有什么特点和优势?
  6. Unity OBB分包(基础APK+OBB) 与apk签名
  7. Oracle 数据库版本和位数sql语句查看方法
  8. 机器学习-分类之AdaBoost原理及实战
  9. 斐波那契数列快速算法详解
  10. php 图片系统,Linger
  11. 数据库每日一题 2020.05.08
  12. 服务器webpack构建性能,webpack构建和性能优化探索
  13. QQ音乐无损下载工具 Music Download Man v3.1绿色版
  14. dw网页制作教程百度云盘_Dreamweaver网页制作教程
  15. Maya粒子消散特效制作(三)
  16. 四川服务器磁盘阵列卡电池性能,内置磁盘阵列卡的不足之处
  17. 小白怎样使用EXCEL导入MATLAB画出图像
  18. 程序员接私单需要注意的几大问题
  19. 【二叉树】重建二叉树
  20. python把文字矢量化_如何将点阵汉字矢量化 | indienova

热门文章

  1. 如何保证MySQL和Redis的数据一致性?
  2. 揭秘 Uber API 网关的架构,建议收藏!
  3. 面试官:谈谈分布式锁的实现
  4. 一篇文章搞定大规模容器平台生产落地十大实践
  5. 阿里暴跌近6%,蒸发2400亿!拼多多火了,股价暴涨近15%!这个幕后的程序员开挂了,马云,刘强东都怕!...
  6. 从 Nginx 优秀的核心架构设计,揭秘其为何能支持高并发?
  7. 纯!干!货!2019年19个Docker面试问题和解答!一线大厂必看!
  8. 来自顶尖JAVA程序猿的焦虑,拒绝中年危机,唯有一生力学笃行
  9. 为什么说21世纪是一场ABC的革命?
  10. 产品需求管理经验分享