计算给定数据集的香农熵

构造决策树,面对一个数据集,首先找到具有决定性作用的特征,对每个特征进行评估,然后根据特征划分数据集。
如果分支下的数据属于同一类型,即停止,不属于同一类型,重复划分数据子集。
采用量化的方法判断如何划分数据
在划分数据集之前之后信息发生的变化称为信息增益,获得信息增益最高的特征就是最好的选择。

from math import log#math模块中的对数函数

def calcShannonEnt(dataSet):
    numEntries = len(dataSet)
    labelCounts = {}#计算数据集中数据的个数,这里是5个
    for featVec in dataSet:#通过循环,featVec=[1,1,'yes']
        currentLabel = featVec[-1]#取出这一行的最后一个数,yes or no
        if currentLabel not in labelCounts.keys():
           labelCounts[currentLabel] = 0
        labelCounts[currentLabel] += 1#yes为2 no为3
    shannonEnt = 0.0
    for key in labelCounts:
        prob = float(labelCounts[key])/numEntries
        shannonEnt -= prob * log(prob,2)
    return shannonEnt#计算香农熵

def createDataSet():
    dataSet = [[1,1,'yes'],
               [1,1,'yes'],
               [1,0,'no'],
               [0,1,'no'],
               [0,1,'no']]
    labels = ['no surfacing','flippers']
    return dataSet,labels

主要是计算鱼类和非鱼类的香农熵

>>> import trees
>>> from imp import reload
>>> reload(trees)
<module 'trees' from 'E:/Python\\trees.py'>
>>> myDat,labels=trees.createDataSet()
>>> myDat
[[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
>>> trees.calcShannonEnt(myDat)
0.9709505944546686
>>> myDat[0][-1]='maybe'
>>> myDat
[[1, 1, 'maybe'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
>>> trees.calcShannonEnt(myDat)
1.3709505944546687
>>> 

猜你喜欢

转载自blog.csdn.net/qq_42799920/article/details/81261103
今日推荐