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

Posted 王明辉的部落

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《机器学习实战》第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],


    ]

    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]

以上是关于《机器学习实战》第3章决策树程序清单3-1 计算给定数据集的香农熵calcShannonEnt()运行过程的主要内容,如果未能解决你的问题,请参考以下文章

机器学习实战-第3章-决策树算法(ID3)

机器学习实战 - ApacheCN

第 2 章 监督学习Python机器学习基础教程

《机器学习》(周志华)第4章 决策树 笔记 理论及实现——“西瓜树”——CART决策树

机器学习实战之第三章 决策树(Decision Tree)

第3章 机器学习的典型应用 3-3 典型应用-朴素贝叶斯和决策树