计算熵函数python 熵 计算公式

在熵编码中,熵值的计算

计算步骤如下图:

我们提供的服务有:成都网站制作、网站设计、微信公众号开发、网站优化、网站认证、莲池ssl等。为上1000家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的莲池网站制作公司

在信息论中,熵是对不确定性的一种度量。信息量越大,不确定性就越小,熵也就越小;信息量越小,不确定性越大,熵也越大。根据熵的特性,我们可以通过计算熵值来判断一个事件的随机性及无序程度,也可以用熵值来判断某个指标的离散程度,指标的离散程度越大,该指标对综合评价的影响越大。

熵的公式

熵的公式如下:

1、克劳修斯首次从宏观角度提出熵概念,其计算公式为:S=Q/T,(计算熵差时,式中应为△Q);

2、波尔兹曼又从微观角度提出熵概念,公式为:S=klnΩ,Ω是微观状态数,通常又把S当作描述混乱成度的量。

理想气体的体积熵为:SV=klnΩv=klnV,温度熵为:ST=klnΩT=(3/2)klnT,计算任意过程的熵差公式为:△S=(3/2)kln(T'/T)+kln(V'/V)。

什么是熵,如何计算?

熵(Entropy)原本是一个热力学概念,用来描述物质的混乱程度。熵越大,物质越混乱。

香浓借鉴了热力学中的概念,把信息中排除了冗余后的平均信息量称为“信息熵”,并给出了计算信息熵的数学表达式。

通常,一个信源发送出什么符号是不确定的,衡量它可以根据其出现的概率来度量。概率大,出现机会多,不确定性小;反之不确定性就大。不确定性函数f是概率P的减函数;两个独立符号所产生的不确定性应等于各自不确定性之和,即f(P 1, P 2 )=f(P 1 )+f(P 2 ),这称为可加性。同时满足这两个条件的函数f是对数函数,即

当0和1各占50%时,发射的信号0和1各占50%,此时信号最为混乱;当0或1出现概率为100%时,信号中只有一个值,此时所包含的信息非常“整洁”,所以信息熵时0。

已知男女所占比率各为50%,所有人群中抽烟占40%,不抽烟占60%,而在抽烟人群中95%都是男性,不抽烟人群中80%是女性。如果我们已知一个人抽烟,那么我们可以很有信心的说该烟民为男性,但是我们如何去度量这种信心呢?因此,我们引入了熵, 熵是用来度量该系统的不确定性,我们有多大的把握说出该烟民为男性 。试想一下,当烟民中男女比例各占50%的时候,这是最不容易确定该烟民性别的情况,所以这个时候熵很高(信息很混乱)。

当男女烟民各占50%时,熵的计算过程为(以2为底):

我们令事件X不抽烟为a,抽烟为b,则X:{a=No-smoking, b=smoking}。

则不抽烟的人的熵为:

抽烟的人的熵为为:

可以看到烟民中性别分布要比非烟民更加不均衡,在这种情况下如果我们知道ta抽烟,则我们对ta的性别的判断更加准确。

抽烟事件整体的熵为:

我们在知道了烟民和非烟民中男女比例后要比瞎猜要准确多少如何度量呢,这时候引入新的概念,信息增益:

参考:

1. 百度百科-信息熵

[损失函数]——交叉熵

在了解交叉熵之前我们需要关于熵的一些基本知识,可以参考我的上一篇 博客 [1] 。

信息熵的定义为离散随机事件的出现概率 [2] 。当一个事件出现的概率更高的时候,我们认为该事件会传播的更广,因此可以使用信息熵来衡量信息的价值。

当一个信源具有多种不同的结果,记为:U1,U2,...,Un,每个事件相互独立,对应的概率记为:P1,P2,...,Pn。信息熵为各个事件方式概率的期望,公式为:

对于二分类问题,当一种事件发生的概率为p时,另一种事件发生的概率就为(1-p),因此,对于二分类问题的信息熵计算公式为:

相对熵(relative entropy),又被称为Kullback-Leibler散度(Kullback-leibler divergence),是两个概率分布间差异的一种度量 [3] 。在信息论中,相对熵等于两个概率分布的信息熵的差值。

相对熵的计算公式为:

其中 代表事件的真实概率, 代表事件的预测概率。例如三分类问题的标签为 ,预测标签为 。

因此该公式的字面上含义就是真实事件的信息熵与理论拟合的事件的香农信息量与真实事件的概率的乘积的差的累加。[4]

当p(x)和q(x)相等时相对熵为0,其它情况下大于0。证明如下:

KL散度在 Pytorch 中的使用方法为:

在使用过程中, reduction 一般设置为 batchmean 这样才符合数学公式而不是 mean ,在以后的版本中 mean 会被替换掉。

此外,还要注意 log_target 参数,因为在计算的过程中我们往往使用的是log softmax函数而不是softmax函数来避免underflow和overflow问题,因此我们要提前了解target是否经过了log运算。

torch.nn.KLDivLoss() 会传入两个参数 (input, target) , input 是模型的预测输出, target 是样本的观测标签。

下面我们用一个例子来看看 torch.nn.KLDivLoss() 是如何使用的:

输出结果如下:

相对熵可以写成如下形式:

等式的前一项为真实事件的熵,后一部分为 交叉熵 [4] :

在机器学习中,使用KL散度就可以评价真实标签与预测标签间的差异,但由于KL散度的第一项是个定值,故在优化过程中只关注交叉熵就可以了。一般大多数机器学习算法会选择交叉熵作为损失函数。

交叉熵在pytorch中可以调用如下函数实现:

其计算方法如下所示 [5] :

假设batch size为4,待分类标签有3个,隐藏层的输出为:

经过 softmax 激活函数之后得到预测值:

softmax函数的输出结果每一行相加为1。

假设这一个mini batch的标签为

根据交叉熵的公式:

代表真实标签,在真实标签中,除了对应类别其它类别的概率都为0,实际上,交叉熵可以简写为:

所以该mini batch的loss的计算公式为(别忘了除以batch size,我们最后求得的是mini batch的平均loss):

因此,我们还需要计算一次对数:

计算结果为:

根据交叉熵的计算公式,loss的最终计算等式为:

运算结果和pytorch内置的交叉熵函数相同:

结果为:

除了 torch.nn.CrosEntropyLoss() 函数外还有一个计算交叉熵的函数 torch.nn.BCELoss() 。与前者不同,该函数是用来计算二项分布(0-1分布)的交叉熵,因此输出层只有一个神经元(只能输出0或者1)。其公式为:

在pytorch中的函数为:

用一个实例来看看如何使用该函数:

输出结果为:

它是如何计算的呢,我们接下来一步步分析:

首先输入是:

需要经过 sigmoid 函数得到一个输出

输出结果为:

然后我们根据二项分布交叉熵的公式:

得到 loss 的如下计算公式:

和pytorch的内置函数计算结果相同。

另外,需要注意的是, 当使用交叉熵作为损失函数的时候,标签不能为onehot形式,只能是一维的向量 ,例如,当batch size是5时,这一个batch的标签只能时[0,1,4,2,6]这样的形式。

熵怎么计算

热力学中表征物质状态的参量之一,通常用符号S表示。在经典热力学中,可用增量定义为dS=(dQ/T),式中T为物质的热力学温度;dQ为熵增过程中加入物质的热量;下标“可逆”表示加热过程所引起的变化过程是可逆的。若过程是不可逆的,则dS>(dQ/T)不可逆。单位质量物质的熵称为比熵,记为 s。熵最初是根据热力学第二定律引出的一个反映自发过程不可逆性的物质状态参量。热力学第二定律是根据大量观察结果总结出来的规律,有下述表述方式:①热量总是从高温物体传到低温物体,不可能作相反的传递而不引起其他的变化;②功可以全部转化为热,但任何热机不能全部地、连续不断地把所接受的热量转变为功(即无法制造第二类永动机);③在孤立系统中,实际发生的过程,总使整个系统的熵值增大,此即熵增原理。摩擦使一部分机械能不可逆地转变为热,使熵增加。热量dQ由高温(T1)物体传至低温(T2)物体,高温物体的熵减少dS1=dQ/T1,低温物体的熵增加dS2=dQ/T2,把两个物体合起来当成一个系统来看,熵的变化是dS=dS2-dS1>0,即熵是增加的。

物理学上指热能除以温度所得的商,标志热量转化为功的程度。物质都有自己的标准熵,一个反应可以根据各种物质的熵来计算熵变。ΔH-TΔs是计算自由能的公式,用来判断反应的自发性。


分享文章:计算熵函数python 熵 计算公式
文章起源:http://azwzsj.com/article/hjieis.html