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

熵的定义

熵(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: PyCharmfrom math import logdef 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: PyCharmfrom tree import calcEntropyimport numpy as npimport 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时概率均等,熵最大

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180421G1I4M700?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券