python实现香农熵计算

#!/usr/bin/env python
# encoding: utf-8
"""
@author: wanwei
@license: (C) Copyright 2013-2017, Node Supply Chain Manager Corporation Limited.
@contact: [email protected]
@software: pycharm
@file: shangnon.py
@time: 2019/4/4 14:03
@desc:
"""
import math

def createDataSet():
    """
    创建数据集
    :return:
    """
    dataSet = [[u'青年',u'否',u'否',u'一般',u'拒绝'],
               [u'青年', u'否', u'否', u'好', u'同意'],
               [u'青年', u'是', u'否', u'好', u'拒绝'],
               [u'青年', u'是', u'是', u'好', u'同意'],
               [u'青年', u'是', u'是', u'一般', u'同意'],
               [u'青年', u'是', u'否', u'一般', u'同意'],
               [u'中年', u'否', u'否', u'一般', u'同意'],
               [u'中年', u'否', u'否', u'好', u'拒绝'],
               [u'中年', u'是', u'否', u'好', u'拒绝'],
               [u'中年', u'是', u'是', u'好', u'拒绝'],
               [u'中年', u'是', u'是', u'一般', u'拒绝'],
               [u'中年', u'是', u'否', u'一般', u'拒绝'],
               [u'老年', u'否', u'否', u'一般', u'同意'],
               [u'老年', u'否', u'否', u'好', u'拒绝'],
               [u'老年', u'是', u'否', u'好', u'拒绝'],
               [u'老年', u'是', u'是', u'好', u'拒绝'],
               [u'老年', u'是', u'是', u'一般', u'同意'],
               [u'老年', u'是', u'否', u'一般', u'拒绝'],
               ]
    labelSet = [u'年龄',u'有工作',u'有房子',u'信贷情况']
    # 返回数据集和标签
    return dataSet, labelSet

def cacShannonEnt(dataSet):
    """
    计算训练数据集Y随机变量的香农熵
    :param dataSet:
    :return:
    """
    numEntries = len(dataSet)
    labelCounts = {}
    for featvec in dataSet:
        currentLbel = featvec[-1]
        if currentLbel not in labelCounts.keys():
            labelCounts[currentLbel] = 0
        labelCounts[currentLbel] += 1
    shannonEnt = 0.0
    for key in labelCounts:
        prob = float(labelCounts[key])/numEntries
        shannonEnt -= prob * math.log(prob, 2) # log base 2
    return shannonEnt

if __name__ == '__main__':
    dataSet, labelSet = createDataSet()
    print(cacShannonEnt(dataSet))

你可能感兴趣的:(算法,python)