我最近在我的大学开设了一门数据压缩课程。然而,我发现“熵”这个词在计算机科学中的使用相当含糊。据我所知,它粗略地转化为系统或结构的“随机性”。
计算机科学“熵”的正确定义是什么?
我最近在我的大学开设了一门数据压缩课程。然而,我发现“熵”这个词在计算机科学中的使用相当含糊。据我所知,它粗略地转化为系统或结构的“随机性”。
计算机科学“熵”的正确定义是什么?
熵可能意味着不同的东西:
在计算中,熵是操作系统或应用程序收集的随机性,用于密码学或其他需要随机数据的用途。这种随机性通常是从硬件来源收集的,要么是预先存在的,例如鼠标移动,要么是专门提供的随机性生成器。
在信息论中,熵是与随机变量相关的不确定性的度量。在这种情况下,该术语本身通常指的是香农熵,它在预期值的意义上量化了消息中包含的信息,通常以比特等单位为单位。等价地,香农熵是当一个人不知道随机变量的值时所丢失的平均信息内容的量度
数据压缩中的熵
数据压缩中的熵可能表示您输入到压缩算法的数据的随机性。熵越大,压缩比越小。这意味着文本越随机,您可以压缩的越少。
香农的熵表示对任何通信的最佳可能无损压缩的绝对限制:将要编码的消息视为一系列独立且同分布的随机变量,香农的源编码定理表明,在限制中,最短的平均长度对给定字母表中的消息进行编码的可能表示是它们的熵除以目标字母表中符号数量的对数。
在Andrew Hunt 和 David Thomas的优秀著作The Pragmatic Programmer: From Journeyman to Master的第 1 章中可以找到我最喜欢的定义,该定义更加注重实际:
软件熵
虽然软件开发几乎不受所有物理定律的影响,但熵对我们的打击很大。熵是物理学中的一个术语,指的是系统中“无序”的数量。不幸的是,热力学定律保证宇宙中的熵趋于最大值。当软件中的混乱增加时,程序员称之为“软件腐烂”。
有许多因素会导致软件腐烂。最重要的似乎是在项目中起作用的心理学或文化。即使你是一个人的团队,你的项目心理也可能是一件非常微妙的事情。尽管有最好的计划和最好的人,一个项目在其生命周期中仍然会经历毁灭和衰败。然而,还有其他一些项目,尽管遇到了巨大的困难和不断的挫折,但成功地对抗了大自然的无序倾向,并取得了相当不错的成绩。
...
...
一扇破碎的窗户。
一扇破碎的窗户,长时间未修复,给建筑物的居民灌输一种被遗弃的感觉——一种当权者不关心建筑物的感觉。所以另一个窗口被打破了。人们开始乱扔垃圾。涂鸦出现。开始严重的结构损坏。在相对较短的时间内,建筑物的损坏超出了业主的修复意愿,被遗弃的感觉变成了现实。
“破窗理论”启发了纽约和其他主要城市的警察部门打击小事,以阻止大事。它很管用:随时注意破窗、涂鸦和其他轻微违规行为,从而降低了严重犯罪水平。
提示 4
不要忍受破碎的窗户
不要让“破窗”(糟糕的设计、错误的决定或糟糕的代码)得不到修复。发现后立即修复。如果没有足够的时间来正确修复它,然后将其登上。也许您可以注释掉有问题的代码,或者显示“未实现”消息,或者替换为虚拟数据。采取一些措施来防止进一步的损害,并表明你已经掌握了局势。
文字取自: http: //pragprog.com/the-pragmatic-programmer/extracts/software-entropy
我总是遇到香农熵意义上的熵。
来自http://en.wikipedia.org/wiki/Information_entropy:
在信息论中,熵是与随机变量相关的不确定性的度量。在这种情况下,该术语本身通常指的是香农熵,它在预期值的意义上量化了消息中包含的信息,通常以比特等单位为单位。等效地,香农熵是当一个人不知道随机变量的值时丢失的平均信息内容的量度。
这是信息论中熵的一个很好的替代解释。
熵是进行预测时所涉及的不确定性的量度。
我们也可以将熵描述为,如果我们在做出初步预测后得到结果,我们会有多惊讶。
假设我们有一个弯曲的硬币,它在 99% 的情况下给我们正面,在 1% 的情况下给我们一个反面。由于只有百分之一的机会得到尾巴,如果我们真的得到尾巴,我们会非常惊讶。另一方面,如果我们得到正面,也不会太令人惊讶,因为我们已经有 99% 的机会获得正面。
假设我们有一个名为的函数Surprise(x)
,它会给我们每个结果带来的惊喜量;然后我们可以平均概率分布上的惊喜量。这个平均惊喜量也可以用来衡量我们的不确定性。这种不确定性称为熵。
更新:
我做了这个可视化来描述动物图像分类器模型(机器学习)中预测类的熵和置信度之间的关系。在这里,熵被用来衡量分类器模型对其预测的置信度。
该图显示了来自两个分类器模型的预测熵值的比较。右图以相对较高的置信度(较低熵)预测马的图像,而左边的分类器无法真正区分(较高熵)它是马、牛还是长颈鹿。
在压缩和信息论方面,源的熵是来自源的符号可以传达的平均信息量(以比特为单位)。通俗地说,一个符号越不可能出现,它的出现带来的惊喜就越多。
如果您的来源有两个符号,比如说A
和B
,并且它们的可能性相同,那么每个符号都传达相同数量的信息(一位)。具有四个同等可能符号的源每个符号传送两个比特。
举个更有趣的例子,如果您的来源包含三个符号 、A
和B
,C
其中前两个的可能性是第三个的两倍,那么第三个更令人惊讶,但可能性也较小。该源的净熵为 1.52,计算如下。
您将熵计算为“平均惊喜”,其中每个符号的“惊喜”是其概率乘以概率的负二进制对数:
binary
symbol weight probability log surprise
A 2 0.4 -1.32 0.53
B 2 0.4 -1.32 0.53
C 1 0.2 -2.32 0.46
total 5 1.0 1.52
(当然)使用二进制日志的负数,因为值在 0 和 1(不包括)之间的日志是负数。
熵这个词可以用一句话来定义:
举个宇宙膨胀的例子:从一开始,所有物质都聚集在大爆炸之前的一个小点上,所以我们可以用“所有物质都在一个点之内”来描述这个系统。虽然今天需要更多的信息来描述系统(即宇宙),但需要描述所有行星的位置、它们的运动、它们上面的东西等。就信息论而言,该定义也适用:例如:添加到密码(系统)中的字母越多,描述密码所需的信息就越多。然后你可以用不同的单位来测量它,例如位或字符,比如“你好”= 5 个字符熵 = 40 位熵(如果 charsize 是 8 位)。
这也意味着您拥有的信息越多,您可以安排这些信息的方式就越多。如果您有 40 位,则可以有 2^40 种不同的方式来安排它们。如果我们在这里谈论密码,那么信息(位)的可能排列越多,破解所需的时间就越长(使用蛮力或字典攻击)。
简而言之,熵定义了随机性。它更像是不可预测的事情。用更专业的术语来说,“在计算中,熵是操作系统或应用程序收集的随机性,用于密码学或其他需要随机数据的用途。这种随机性通常是从硬件来源收集的,要么是预先存在的,例如鼠标移动,要么是专门提供的随机性发生器。” 由维基百科定义。
现在可以很容易地得出关于文件的熵的含义,作为对文件中字节的无序程度的度量。有多种单位用于定义熵,例如 nat、shannon 或 hartley。嗯,最常用的单位是香农。根据香农算法,文件的熵必须进入的值范围是 0 到 8。因此,当熵值为零时,可以说结果是确定的。相反,当熵值为 8 时,结果是最不可预测的。香农给出的衡量事件结果随机性的公式是:
Entropy = ∑ pi log(1/pi)
其中i是概率为pi的事件。
这个等式的结果总是在 0 到 8 之间。
有关更多信息,请访问链接:https ://www.talentcookie.com/2016/02/file-entropy-in-malware-analysis/
熵就像病毒研究人员的哈希码一样。您获得的熵越少,这意味着它可能是加密或压缩代码,可能是病毒。
标准二进制文件的熵将高于压缩或加密的二进制文件。
熵通常在计算机科学中具有许多含义。这取决于上下文。在安全性中,熵意味着您放置了多少随机性,例如,当您生成私钥时,许多应用程序要求您移动鼠标以生成熵。这通过获取随机性的“人”元素并将其添加到生成密钥的散列过程中来生成熵。
现在还有一个关于熵的软件工程的定义。这个定义代表过时的代码,或者已经有许多开发人员编写的代码。通常用于参考何时重构您的软件项目。“该项目的代码具有大量的熵,因为许多维护它的人目前不在该项目中”。
这是我也记得的第三个示例用法。在模拟退火的主题中(就计算机科学而言),熵被描述为在评估算法期间发生了多少衰减。
我想回答你的问题,除了你可以在字典中找到的那些之外,“熵”这个词没有一个具体的定义。计算机科学如何倾向于应用该术语取决于所使用术语的上下文以及它所应用于的内容。
用熵很容易做大事。在我看来,这是一个非常简单和有用的概念。
基本上,它量化了平均而言,您将从事件中学到什么,例如掷硬币、执行分支指令或索引数组。
就像搜索算法中间的比较操作一样,有一定概率 P 取一个分支,1-P 取另一个分支。
假设 P 是 1/2,因为它在二进制搜索中。然后,如果你选择那个分支,你知道的比以前多 1 位,因为 log(2/1),以 2 为底,是 1。另一方面,如果你选择另一个分支,你也会学到 1 位。
要获得您将学习的平均信息量,请将您在第一个分支上学到的内容乘以您选择该分支的概率,再加上您在第二个分支上学到的内容乘以该分支的概率。
1/2 乘以 1 位,再加上 1/2 乘以 1 位,就是 1/2 位加上 1/2 位,或总共 1 位熵。这就是您可以期望从该决定中平均学到的东西。
另一方面,假设您在一个包含 1024 个条目的表中进行线性搜索。
在第一个 == 测试中,YES 的概率是 1/1024,所以在那个决定 YES 的熵是
1/1024 times log(1024/1)
或 1/1024 * 10 = 大约 1/100 位。
因此,如果答案是肯定的,您将学习 10 位,但这种机会大约是千分之一。
另一方面,NO 的可能性更大。它的熵是
1023/1024 * log(1024/1023)
或大约 1 倍大约为零 = 大约为零。
将两者相加,平均而言,您将了解该决定的 1/100。
这就是线性搜索慢的原因。每个决策的熵(您可以期望学习多少)太小,因为您必须学习 10 位才能找到表中的条目。
计算机科学中的熵通常是指一串位的随机性。以下问题是关于使其精确:
简单来说,如果你知道语言中符号的概率,就可以计算出语言中符号的平均信息量。
或者
一种语言的熵是该语言中一个平均符号的信息内容的量度
考虑一个公平的硬币;
有两个符号,每个符号的概率为 1/2,因此熵计算为
h =-(1/2*log1/2 +1/2*log1/2)=1
熵是指偶尔根据客户要求对软件进行重构的程度,因此为满足客户需求而对其进行重构的成本变得最大。
我听说人们滥用熵 wrt CS 的热力学定义。
例如,在这个系统中熵肯定在增加。
当他们的意思是这段代码变得越来越糟糕时!