《机器学习实战》第3章决策树程序清单3-1 计算给定数据集的香农熵calcShannonEnt()运行过程
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 |
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()运行过程的更多相关文章
- 《机器学习实战之第二章k-近邻算法》
入坑<机器学习实战>: 本书的第一个机器学习算法是k-近邻算法(kNN),它的工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据 ...
- 《机器学习实战第7章:利用AdaBoost元算法提高分类性能》
import numpy as np import matplotlib.pyplot as plt def loadSimpData(): dataMat = np.matrix([[1., 2.1 ...
- Java程序员必了解的JVM原理以及虚拟机的运行过程
JVM概念 虚拟机:指以软件的方式模拟具有完整硬件,VM概念 虚拟机:指以软件的方式模拟具有完整硬件系统功能.运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现.常用的虚拟机有VMWare ...
- 机器学习实战书-第二章K-近邻算法笔记
本章介绍第一个机器学习算法:A-近邻算法,它非常有效而且易于掌握.首先,我们将探讨女-近邻算法的基本理论,以及如何使用距离测量的方法分类物品:其次我们将使用?7««^从文本文件中导人并解析数据: 再次 ...
- 《机器学习实战》---第二章 k近邻算法 kNN
下面的代码是在python3中运行, # -*- coding: utf-8 -*- """ Created on Tue Jul 3 17:29:27 2018 @au ...
- 【机器学习实战】第3章 决策树(Decision Tree)
第3章 决策树 <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/ ...
- 【机器学习实战学习笔记(2-2)】决策树python3.6实现及简单应用
文章目录 1.ID3及C4.5算法基础 1.1 计算香农熵 1.2 按照给定特征划分数据集 1.3 选择最优特征 1.4 多数表决实现 2.基于ID3.C4.5生成算法创建决策树 3.使用决策树进行分 ...
- 机器学习实战python3 决策树ID3
代码及数据:https://github.com/zle1992/MachineLearningInAction 决策树 优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特 ...
- 决策树ID3算法python实现 -- 《机器学习实战》
from math import log import numpy as np import matplotlib.pyplot as plt import operator #计算给定数据集的香农熵 ...
随机推荐
- Git学习笔记(三)
Git提交相关内容 在Git提交时,会保存一个提交对象,该对象包括一个指向暂存区内容快照的指针,包括本次提交作者等相关附属信息,包括零个或多个指向该提交对象的父对象指针:首次提交时是没有祖先,普通提交 ...
- Eclipse Maven 配置setting.xml 的镜像远程仓库
1.在.m2中新建settings.xml文件 1.window-->Preferences-->Maven-->User Settings 3.点击open file 编辑将远程仓 ...
- Go并发编程(四)
并发基础 多进程 多线程 基于回调的非阻塞/异步IO 协程 协程 与传统的系统级线程和进程相比,协程的最大优势在于其“轻量级”,可以轻松创建上百万个而不会导致系统资源衰竭, ...
- CentOS-6.4 安装 PHP Memcached 扩展
1.获取安装文件包 [root@phpdragon home]# wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmem ...
- Discuz!X 3.4 任意文件删除漏洞复现过程(附python脚本)
今天看下群里在讨论Discuz!X 3.4 任意文件删除漏洞,自己做了一些测试,记录一下过程.结尾附上自己编写的python脚本,自动化实现任意文件删除. 具体漏洞,请查看 https://paper ...
- 【RF库Collections测试】Log Dictionary 【同log list】
Name:Log DictionarySource:Collections <test library>Arguments:[ dictionary | level=INFO ]Logs ...
- [转]linux下释放文件内存
在Linux系统下,我们一般不需要去释放内存,因为系统已经将内存管理的很好.但是凡事也有例外,有的时候内存会被缓存占用掉,导致系统使用SWAP空间影响性能,此时就需要执行释放内存(清理缓存)的操作了. ...
- 解决layui下拉选择框只能选择不能手动输入文字
审查元素可以看到,layui的select下拉框是用input和div模拟出来的,所以,如下例子,我的解决方法是:$('.mySelect').find('input').removeAttr(&qu ...
- 微信小程序学习指南
作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- mysqlint类型的长度值mysql在建表的时候int类型后的长度代表什么
详解mysql int类型的长度值 mysql在建表的时候int类型后的长度代表什么 是该列允许存储值的最大宽度吗 为什么我设置成int(1), 也一样能存10,100,1000呢. 当时我虽然知道i ...