机器学习之熵【从定义到代码】

熵的定义

  • 熵(entropy)的本质是一个系统“内在的混乱程度”,原是热力学概念,被香农引用到信息论中,被称为香农熵;
  • 熵在热力学中可以理解为能量转换过程中变为新状态(浪费掉的、无法再利用的)能量称为熵, 这部分能量转换会让系统的混乱度增加,熵就是系统的混乱度;如图中冰块融化为液态水,有序排列的分子吸收能量后变得无序,状态可变,系统更混乱,因此它的熵更高;
  •                        机器学习之熵【从定义到代码】
  • 熵在信息论中也成为香农熵或信息熵,解决了信息的度量问题,对于某个变量(如得世界杯冠军),其不确定性越大,熵也就越大,搞清楚所需信息量也越大。

信息量

  • 所谓信息量是指从N个相等可能事件中选出一个事件所需要的信息度量或含量,也就是在辩识N个事件中特定的一个事件的过程中所需要提问"是或否"的最少次数. 如一个汉字的信息量是多少呢? 假设常用汉字1024个,那么选中每个字概率为1/1024, 信息量为10bit,没错单位就是bit比特,利用二分查找你需要询问10次可以定位这个汉字!
  • 计算公式
机器学习之熵【从定义到代码】

熵的计算

  • 整个概率分布对应的信息量的平均值.这个平均值就叫做随机变量x的熵 
  • 熵的计算公式如下:  即信息量的期望值

机器学习之熵【从定义到代码】

熵的代码实现与分析

# -*- coding: utf-8 -*-
# @Time    : 2018/4/19 17:04
# @Author  : mjautoman
# @Site    : 
# @File    : tree.py
# @Software: PyCharm
from math import log
def calcEntropy(dataSet):
    numEntries = len (dataSet)
    labelDic = {}
    for vec in dataSet:
        currentLabel = vec[-1] # 最后一列
        if not labelDic.has_key(currentLabel):
            labelDic[currentLabel] = 1
        else:
            labelDic[currentLabel] += 1
    entropy = 0.0
    for key in labelDic:
        pi = float(labelDic[key]) / numEntries
        entropy -= pi * log(pi,2)

    return entropy


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/4/19 16:53
# @Author  : mjautoman
# @Site    : 
# @File    : entropy.py
# @Software: PyCharm

from tree import calcEntropy
import numpy as np
import matplotlib.pyplot as plt

'''  概率x服从正态分布时,对x * log2(x)在(0,1)区间积分,得到香农熵曲线图
x = np.arange(0, 1, 0.01)
y = -x * np.log2(x) - (1 - x) * np.log2(1 - x)
plt.plot(x, y)
plt.show()
'''

dataSet = [[1,1,'1'],
           [1,0,'3'],
           [0,1,'1'],
           [0,1,'1'],
           [1,1,'2'],
           [1,0,'1'],
           [0,1,'1'],
           [0,1,'1']]

entropy = calcEntropy(dataSet)
print(entropy)

  • 修改dataSet 最后一列的分类结果,当全为“1”这一种分类时,得到entropy熵值为0,因为分类结果100%确定为“1”,不确定性为0;
  • 修改dataSet 最后一列的分类结果,分类结果为数量相等的几类如8个“1”或4个“1”4个“2”,得到entropy熵值为3.0即log2(8),因为分类结果概率均等,不确定性最大;
  • 概率x服从正态分布时,对x * log2(x)在(0,1)区间积分,得到香农熵曲线图如下,表明p=0或1时,没有不确定性,此时熵值为0,p=0.5时概率均等,熵最大
  • 机器学习之熵【从定义到代码】