程序技术好文:香农熵学习+例子【转载】

简介: 程序技术好文:香农熵学习+例子【转载】

"

转自:

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

2.香农熵计算公式

3.使用的数据集

4.测试代码

# 代码功能:计算香农熵

from math import log #我们要用到对数函数,所以我们需要引入math模块中定义好的log函数(对数函数)

def 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

def calcShannonEnt(dataSet):#传入数据集

# 在这里dataSet是一个链表形式的的数据集

countDataSet = len(dataSet) # 我们计算出这个数据集中的数据个数,在这里我们的值是5个数据集

labelCounts={} # 构建字典,用键值对的关系我们表示出 我们数据集中的类别还有对应的关系

for featVec in dataSet: #通过for循环,我们每次取出一个数据集,如featVec=【1,1,'yes'】

currentLabel=featVec【-1】 # 取出最后一列 也就是类别的//代码效果参考:https://v.youku.com/v_show/id_XNjQwNjU5MzA2MA==.html

那一类,比如说‘yes’或者是‘no’

if currentLabel not in labelCounts.keys():

labelCounts【currentLabel】 = 0

labelCounts【currentLabel】 += 1#统计这个类别出现了多少次。

print(labelCounts) # 最后得到的结果是 {'yes': 2, 'no': 3}

shannonEnt = 0.0 # 计算香农熵, 根据公式

for key in labelCounts:

prob = float(labelCounts【key】)/countDataSet

shannonEnt -= prob * log(prob,2)

return shannonEnt

data,labels=createDataSet();

se=calcShannonEnt(data);

print(se);

print(labels);

运行结果:

{'yes': 2, 'no': 3}

0.9709505944546686

【'no surfacing', 'flippers'】

5.将dataset改变

dataSet = 【【1,1,'yes'】,

【1,1,'yes'】,

【1,0,'no'】,

【0,1,'no'】,

【0,1,'no'】,

【0,1,'maybe'】】 # 我们定义了一个list来表示我们的数据集,这里的数据对应的是上表中的数据

多加入了最后一种,运行结果:

{'yes': 2, 'no': 3, 'maybe': 1}

1.4591479170272448

【'no surfacing', 'flippers'】

很明显,香农熵是增加的,因为它的含义//代码效果参考:https://v.youku.com/v_show/id_XNjQwNjU5MTgzNg==.html

就是所包含的信息量。

//学习了!


"
image.png
目录
打赏
0
0
0
0
43
分享
相关文章
|
10月前
|
信息论与编码期末复习——概念论述简答题(一)
信息论与编码期末复习——概念论述简答题(一)
320 0
信息论与编码期末复习——概念论述简答题(一)
刘谦春晚纸牌魔术背后的数学—海明码原理简介
刘谦春晚纸牌魔术背后的数学—海明码原理简介
|
9月前
|
程序技术好文:概率论与数理统计图式(第三章多维随机变量)
程序技术好文:概率论与数理统计图式(第三章多维随机变量)
26 0
第7章 网络层第1次练习题答案(第三版)
第7章 网络层第1次练习题答案(第三版)
119 0
java编程思想第四版第十一章习题
运行结果分析: 这个案例的重点是, 数组瘦受限制的, 集合是没有元素个数限制的。
228 0