信息熵为什么要定义成-Σp*log(p)?
信息熵为什么要定义成-Σp*log(p)?
再解释信息熵之前,需要先来说说什么是信息量。
信息量是对信息的度量,单位一般用bit。
信息论之父克劳德·艾尔伍德·香农(Claude Elwood Shannon )对信息量的定义如下:

在解释这个公式之前,先看看下面的例子。
比如一个黑箱里有2个苹果,8个橙子我们把从黑箱里取苹果、橙子看成是一个随机过程,X={x1,x2},其中的随机变量分别表示苹果、橙子。
当我们了解到拿出来的是什么的时候,我们就接受到了信息,这个信息的信息量的大小与这个东西出现的概率有关,这里苹果是0.2,橙子是0.8。越小概率的事情发生,其产生的信息量越大,比如我了解到拿出来的是一个苹果所获得的信息量比一个橙子的信息量要大的多。
所以如果我们要寻找一个函数来定义信息,则该函数要满足如下条件:
要符合随着概率的增大而减小的形式;
函数的值不能为负数,因为信息量最小为0。
带负号的对数函数显然符合以上要求,当然,肯定有其他函数也会符合以上要求,对此,香农在《A Mathematical Theory of Communication》(通信的数学理论)这篇论文中有说明选择对数函数的原因:

大意是说:
如果集合中的消息的数量是有限的,而且每条消息被选择的可能性相等,那么这个消息数或者任意这个消息数的单调函数可以用来做为从集合选择一条消息时产生的信息量的度量。而最自然的选择是对数函数。
关于对数函数更便捷的原因,论文中给出了3点:
- 在实践中更有用。
对数函数可以让一些工程上非常重要的参数比如时间、带宽、继电器数量等与可能性的数量的对数成线性关系,例如,增加一个继电器会使继电器的可能状态数加倍,而如果对这一可能状态数求以2为底的对数,结果只是加 1。加倍时间,可能的消息数会近似变成原来的平方(1,2,4,8,...),而其对数则是加倍(log2 1,log2 2,log2 4,log2 8,...)=(0,1,2,3,...) - 更贴近于人类对度量的直觉。
线性比较就是人类的度量直觉。比如,人们认为,两张打孔卡存储信息的容量应当是一张打孔卡的两倍,两个相同信道的信息传输能力应当是一个信道的两倍。 - 更适用数学运算。
许多极限运算很容易用对数表示,如果采用可能性的数目表示,可能会需要进行冗繁笨拙的重新表述。
那么,为什么选择2为底的对数呢,论文中的解释是这样的:


大致意思是说选择什么为底与用什么单位来度量信息是对应的。采用2为底就是用2进制位,英文:binary digit(香农听了J. W. Tukey的建议,将binary digit简称为bit,bit这个词从此问世)。采用10为底就是用10进制位,而在遇到一些积分和微分的分析中,用e为底有时会很有用,这个时候的信息单位称为自然单位。
个人理解就是这里用什么为底都可以,毕竟单位之间可以转换,但是为了计算方便,如果你使用二进制数字来存储信息,还是用2为底更便捷。比如一开始邮件分类的例子中,有{无聊时阅读的邮件、需及时处理的邮件、无需阅读的邮件}三种,在1000封邮件中,每个类别出现的概率分别是1/2,1/4,1/4。
现在打算用二进制位表示分类,那么就直接可以计算出来各个类别的信息量,也就是各个类别至少需要几个二进制位来表示:
无聊时阅读的邮件:-log2 (1/2) = 1,所以用1个二进制位可以表示;
需及时处理的邮件:-log2 (1/4) = 2,所以用2个二进制位可以表示;
无需阅读的邮件:-log2 (1/4) = 2,所以用2个二进制位可以表示。
那么你可能要问了,虽然计算结果是这样,但是怎么理解呢?
从直觉上理解就是,出现概率越大,信息量越少,比如明天太阳从东边升起,和明天太阳从西边升起,后者的信息量更大是符合直觉判断的;
从存储的角度来理解,对于那些出现概率越大的变量,用越少的位编码的话,就可以节省出越大的空间。
说完了信息量,我们来看看什么是信息熵。
信息量是表达某个事件需要的二进制位数,比如“某个邮件属于需及时处理的邮件”就是一个事件,而所有可能产生的信息量的期望值被定义为信息熵。
根据概率和统计学中对期望值的定义:一个随机变量的期望值是变量的输出值乘以其机率的总和。可以得到信息熵的公式如下:

这里变量的输出值是某个分类对应的信息量,其中的log一般以2为底,变量的机率是某个分类出现的概率。
可以看出,某个数据集中包含的分类越多,信息熵就越大,而包含分类多,说明这个数据集越混乱,越不纯。
因此,在一些机器学习算法比如ID3决策树中就常用信息熵来量化数据集的纯度,以选择出更好的特征来划分数据,让划分出的数据子集越来越纯,最终就可以根据多数表决来决定叶子节点的分类,从而构建出完整的分类决策树。
ok,本篇就这么多内容啦~,感谢阅读O(∩_∩)O。

信息熵为什么要定义成-Σp*log(p)?的更多相关文章
- 为什么信息熵要定义成-Σp*log(p)?
作者:西贝链接:https://www.zhihu.com/question/30828247/answer/64816509来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...
- C++中为什么要将析构函数定义成虚函数
构造函数不可以是虚函数的,这个很显然,毕竟虚函数都对应一个虚函数表,虚函数表是存在对象内存空间的,如果构造函数是虚的,就需要一个虚函数表来调用,但是类还没实例化没有内存空间就没有虚函数表,这根本就是个 ...
- CodeFirst实体类中,为什么都把ICollection<x>定义成virtual?
主要是用于延迟加载,提高性能用的 只有定义成virtual后才可以延迟加载. 延迟加载,默认情况下,延迟加载被支持,如果你希望禁用它,必须显式声明,最好的位置是在 DbContext 的构造器中. p ...
- 为什么android的R类要定义成16进制
联想到c语言中的宏定义:我想是一个原因 如: #define SDL_INIT_TIMER 0x00000001 #define SDL_INIT_AUDIO 0x00000010 #define S ...
- IE6 行内定义成块元素后高度失效
问题描述: ie6下,空标签块元素height定义失效,表现为除设置的height值外还会显示N像素额外的高度. 实际运用中,若标签为空且定义了小于14px的高度,再加入一背景图的话,会发现该元素高度 ...
- docker 存储定义成direct-lvm 模式
配置direct-lvm模式 1. 停止Docker systemctl stop docker 2. 安装依赖包 device-mapper-persistent-data,lvm2, and ...
- Qt 使用qDebug() 打印Qlist 容器数据(将QDebug()定义成某个类的友元函数)
当QList<T>容器中的数据用qDebug() 打印时 ,假如 T 是内置类型(int float ...)与 打印一个字符串使用完全一样,假如T 是一个CustomerClass 那 ...
- 预处理、const、static与sizeof-为什么不把所有的函数都定义成内联函数
1:内联是以代码膨胀(复制)为代价的,仅仅省去了函数调用的开销,从而提高函数的执行效率.如果执行函数体内代码的时间相比于函数调用的开销较大,那么效率的收获会很小.另一方面,每一处内联函数的调用都要复制 ...
- EBS请求定义成菜单
1. 将请求定义为“功能”路径:系统管理员 –应用产品-函数输入自定义的功能名称,用户功能名以及说明 “特性”TAB页: 类型选择“表单”,其余两个字段默认:在表单TAB页: 表单字段:选择“运行 ...
随机推荐
- Python基础之(三)----PyGame安装步骤
http://blog.csdn.net/qq_33166080/article/details/68928563 如果你已经有一定的编程经验,那么学习一门新语言最快的方式就是拿着一个比较中型的项目, ...
- js实现div的碰壁反弹效果
文章地址 https://www.cnblogs.com/sandraryan/ 需求: 写一个div,让div在父级进行匀速运动,碰到父级上下左右的边框,就向反方向运动. 碰壁反弹在游戏制作中很常用 ...
- ACM学习网站、
转载:http://www.cnblogs.com/zhourongqing/archive/2012/05/24/2516180.html http://61.187.179.132/JudgeOn ...
- 微信小程序wx.request 请求方法
data: 最终发送给服务器的数据是 String 类型,如果传入的 data 不是 String 类型,会被转换成 String .转换规则如下: 对于 GET 方法的数据,会将数据转换成 quer ...
- Codeforces Round #200 (Div. 1 + Div. 2)
A. Magnets 模拟. B. Simple Molecules 设12.13.23边的条数,列出三个等式,解即可. C. Rational Resistance 题目每次扩展的电阻之一是1Ω的, ...
- hadoop-1.2.1 伪分布配置
首先JDK安装及相关环境变量配置 # Java environment setting JAVA_HOME=/usr/java/default CLASSPATH=.:$JAVA_HOME/lib/t ...
- P1045 和为给定数
题目描述 给出若干个整数,询问其中是否有一对数的和等于给定的数. 输入格式 共三行: 第一行是整数 \(n(0 \lt n \le 100000)\) ,表示有 \(n\) 个整数. 第二行是n个整数 ...
- mysql导出csv/sql/newTable/txt的方法,mysql的导入txt/sql方法...mysql备份恢复mysqlhotcopy、二进制日志binlog、直接备份文件、备份策略、灾难恢复.....................................................
mysql备份表结构和数据 方法一. Create table new_table_nam备份到新表:MYSQL不支持: Select * Into new_table_name from old_t ...
- ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(6)之配置文件设置
现在该有的结构和层级都有了,下面我们就开始实际应用,首先把需要用的js,css,图片放到Content文件夹中. 这里不详细讲解,大家可根据自己的实际情况,使用合适自己的前端框架,也可以点击下载本项目 ...
- Spring Boot实战之单元测试
Spring Boot实战之单元测试 本文介绍使用Spring测试框架提供的MockMvc对象,对Restful API进行单元测试 Spring测试框架提供MockMvc对象,可以在不需要客户端-服 ...