from math import log

def calcShannonEnt(dataSet):
numEntries = len(dataSet)
print("样本总数:" + str(numEntries)) labelCounts = {} #记录每一类标签的数量 #定义特征向量featVec
for featVec in dataSet: currentLabel = featVec[-1] #最后一列是类别标签 if currentLabel not in labelCounts.keys():
labelCounts[currentLabel] = 0; labelCounts[currentLabel] += 1 #标签currentLabel出现的次数
print("当前labelCounts状态:" + str(labelCounts)) shannonEnt = 0.0 for key in labelCounts: prob = float(labelCounts[key]) / numEntries #每一个类别标签出现的概率 print(str(key) + "类别的概率:" + str(prob))
print(prob * log(prob, 2) )
shannonEnt -= prob * log(prob, 2)
print("熵值:" + str(shannonEnt)) return shannonEnt def createDataSet():
dataSet = [
# [1, 1, 'yes'],
# [1, 0, 'yes'],
# [1, 1, 'no'],
# [0, 1, 'no'],
# [0, 1, 'no'],
# #以下随意添加,用于测试熵的变化,越混乱越冲突,熵越大
# [1, 1, 'no'],
# [1, 1, 'no'],
# [1, 1, 'no'],
# [1, 1, 'no'],
# [1, 1, 'maybe'],
# [1, 1, 'maybe1']
# 用下面的8个比较极端的例子看得会更清楚。如果按照这个规则继续增加下去,熵会继续增大。
# [1,1,'1'],
# [1,1,'2'],
# [1,1,'3'],
# [1,1,'4'],
# [1,1,'5'],
# [1,1,'6'],
# [1,1,'7'],
# [1,1,'8'], # 这是另一个极端的例子,所有样本的类别是一样的,有序,不混乱,此时熵为0
[1,1,''],
[1,1,''],
[1,1,''],
[1,1,''],
[1,1,''],
[1,1,''],
[1,1,''],
[1,1,''],
] labels = ['no surfacing', 'flippers'] return dataSet, labels def testCalcShannonEnt(): myDat, labels = createDataSet()
print(calcShannonEnt(myDat)) if __name__ == '__main__':
testCalcShannonEnt()
print(log(0.000002, 2))

以下输出结果是每个样本的类别都不同时的输出结果:

样本总数:8
当前labelCounts状态:{'1': 1}
当前labelCounts状态:{'1': 1, '2': 1}
当前labelCounts状态:{'1': 1, '2': 1, '3': 1}
当前labelCounts状态:{'1': 1, '2': 1, '3': 1, '4': 1}
当前labelCounts状态:{'1': 1, '2': 1, '3': 1, '4': 1, '5': 1}
当前labelCounts状态:{'1': 1, '2': 1, '3': 1, '4': 1, '5': 1, '6': 1}
当前labelCounts状态:{'1': 1, '2': 1, '3': 1, '4': 1, '5': 1, '6': 1, '7': 1}
当前labelCounts状态:{'1': 1, '2': 1, '3': 1, '4': 1, '5': 1, '6': 1, '7': 1, '8': 1}
1类别的概率:0.125
-0.375
熵值:0.375
2类别的概率:0.125
-0.375
熵值:0.75
3类别的概率:0.125
-0.375
熵值:1.125
4类别的概率:0.125
-0.375
熵值:1.5
5类别的概率:0.125
-0.375
熵值:1.875
6类别的概率:0.125
-0.375
熵值:2.25
7类别的概率:0.125
-0.375
熵值:2.625
8类别的概率:0.125
-0.375
熵值:3.0
3.0
-18.931568569324174
[Finished in 1.3s]

from math import log
def calcShannonEnt(dataSet):numEntries = len(dataSet)print("样本总数:" + str(numEntries))
labelCounts = {} #记录每一类标签的数量
#定义特征向量featVecfor featVec in dataSet:currentLabel = featVec[-1] #最后一列是类别标签
if currentLabel not in labelCounts.keys():labelCounts[currentLabel] = 0;
labelCounts[currentLabel] += 1 #标签currentLabel出现的次数print("当前labelCounts状态:" + str(labelCounts))
shannonEnt = 0.0
for key in labelCounts:prob = float(labelCounts[key]) / numEntries #每一个类别标签出现的概率
print(str(key) + "类别的概率:" + str(prob))print(prob * log(prob, 2) )shannonEnt -= prob * log(prob, 2) print("熵值:" + str(shannonEnt))
return shannonEnt

def createDataSet():dataSet = [# [1, 1, 'yes'],# [1, 0, 'yes'],# [1, 1, 'no'],# [0, 1, 'no'],# [0, 1, 'no'],# #以下随意添加,用于测试熵的变化,越混乱越冲突,熵越大# [1, 1, 'no'],# [1, 1, 'no'],# [1, 1, 'no'],# [1, 1, 'no'],# [1, 1, 'maybe'],# [1, 1, 'maybe1']# 用下面的8个比较极端的例子看得会更清楚。如果按照这个规则继续增加下去,熵会继续增大。# [1,1,'1'],# [1,1,'2'],# [1,1,'3'],# [1,1,'4'],# [1,1,'5'],# [1,1,'6'],# [1,1,'7'],# [1,1,'8'],
# 这是另一个极端的例子,所有样本的类别是一样的,有序,不混乱,此时熵为0[1,1,'1'],[1,1,'1'],[1,1,'1'],[1,1,'1'],[1,1,'1'],[1,1,'1'],[1,1,'1'],[1,1,'1'],]
labels = ['no surfacing', 'flippers']
return dataSet, labels
def testCalcShannonEnt():
myDat, labels = createDataSet()print(calcShannonEnt(myDat))
if __name__ == '__main__':testCalcShannonEnt()print(log(0.000002, 2))

《机器学习实战》第3章决策树程序清单3-1 计算给定数据集的香农熵calcShannonEnt()运行过程的更多相关文章

  1. 《机器学习实战之第二章k-近邻算法》

    入坑<机器学习实战>: 本书的第一个机器学习算法是k-近邻算法(kNN),它的工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据 ...

  2. 《机器学习实战第7章:利用AdaBoost元算法提高分类性能》

    import numpy as np import matplotlib.pyplot as plt def loadSimpData(): dataMat = np.matrix([[1., 2.1 ...

  3. Java程序员必了解的JVM原理以及虚拟机的运行过程

    JVM概念 虚拟机:指以软件的方式模拟具有完整硬件,VM概念 虚拟机:指以软件的方式模拟具有完整硬件系统功能.运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现.常用的虚拟机有VMWare ...

  4. 机器学习实战书-第二章K-近邻算法笔记

    本章介绍第一个机器学习算法:A-近邻算法,它非常有效而且易于掌握.首先,我们将探讨女-近邻算法的基本理论,以及如何使用距离测量的方法分类物品:其次我们将使用?7««^从文本文件中导人并解析数据: 再次 ...

  5. 《机器学习实战》---第二章 k近邻算法 kNN

    下面的代码是在python3中运行, # -*- coding: utf-8 -*- """ Created on Tue Jul 3 17:29:27 2018 @au ...

  6. 【机器学习实战】第3章 决策树(Decision Tree)

    第3章 决策树 <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/ ...

  7. 【机器学习实战学习笔记(2-2)】决策树python3.6实现及简单应用

    文章目录 1.ID3及C4.5算法基础 1.1 计算香农熵 1.2 按照给定特征划分数据集 1.3 选择最优特征 1.4 多数表决实现 2.基于ID3.C4.5生成算法创建决策树 3.使用决策树进行分 ...

  8. 机器学习实战python3 决策树ID3

    代码及数据:https://github.com/zle1992/MachineLearningInAction 决策树 优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特 ...

  9. 决策树ID3算法python实现 -- 《机器学习实战》

    from math import log import numpy as np import matplotlib.pyplot as plt import operator #计算给定数据集的香农熵 ...

随机推荐

  1. Matlab 随机数字

    1.随机生成仅仅有0.1元素的矩阵(m行n列) A=round(rand(m,n)) 2.随机生成每行有若干个0,1元素的矩阵,比方每行仅仅有2个元素为1,其它元素为0 A=zeros(4,5) fo ...

  2. SpringMVC由浅入深day01_2springmvc入门程序

    2 入门程序 2.1 需求 以案例作为驱动. springmvc和mybaits使用一个案例(商品订单管理). 功能需求:商品列表查询 2.2 环境准备 数据库环境:mysql5.5 先导入sql_t ...

  3. 使用InternetGetConnectedState判断本地网络状态(C#举例)

    函数原型:函数InternetGetConnectedState返回本地系统的网络连接状态. 语法: BOOL InternetGetConnectedState( __out LPDWORD lpd ...

  4. office系列调节背景主题

    更改背景主题可以参考:https://jingyan.baidu.com/article/ff42efa9332adec19e220200.html 但是这种方法只是改变了整个软件外框架的背景颜色.以 ...

  5. SSL延迟有多大 (Https)

    据说,Netscape公司当年设计SSL协议的时候,有人提过,将互联网所有链接都变成HTTPs开头的加密链接. 这个建议没有得到采纳,原因之一是HTTPs链接比不加密的HTTP链接慢很多.(另一个原因 ...

  6. PostgreSQL的表空间

    1. 表空间的概念 PostgreSQL中的表空间允许在文件系统中定义用来存放表示数据库对象的文件的位置.在PostgreSQL中表空间实际上就是给表指定一个存储目录. 2. 表空间的作用 官方解释 ...

  7. 【安全开发】python安全编码规范

    申明:本文非笔者原创,原文转载自:https://github.com/SecurityPaper/SecurityPaper-web/blob/master/_posts/2.SDL%E8%A7%8 ...

  8. SpringBoot 常见问题记录

    问题一 Error starting ApplicationContext. To display the auto-configuration report re-run your applicat ...

  9. Java实现给定字符串的倒序输出

    1.除2判中法: public static String orderDesc(String str){ byte [] bytes = str.getBytes(); for ( int i = 0 ...

  10. SpringMVC系列之URL匹配问题

    一.工程目录 二.web.xml配置文件及与其他文件的关系 三.控制器部分 四.返回值 五.url前后缀 六.项目源代码 http://files.cnblogs.com/files/xujian20 ...