熵的介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了熵的介绍相关的知识,希望对你有一定的参考价值。

参考技术A

熵(Entropy)是物理学的一个概率,用于表示一个热力学系统的无序程度。在信息论中,用来衡量一个随机事件的不确定性。假设对一个随机变量X进行编码,自信息 是变量 时的信息量,定义为

那么随机变量 的平均长度,即熵定义为:

当 时,

熵是一个随机变量的平均编码长度,即自信息的数学期望。熵越高,则随机变量的信息越多;熵越低,则信息越少。如果变量 当且仅当在 时 ,则熵为0。也就是说,对于一个确定的信息,其熵为0,信息量也为0。如果其概率分布为一个均匀分布,则熵最大。假设一个随机变量 有三种可能的取值 ,不同概率分布对应的熵如下:

联合熵和条件熵
对于两个离散随机变量 和 ,假设 取值集合为 , 取值集合为 ,其中联合概率分布满足 ,则 和 的联合熵为:

和 的条件熵为:

根据定义,条件熵也可以写为:

互信息是衡量已知一个变量时,另一个变量不确定性减少的程度。两个随机变量 和 的互信息定义为:

互信息的一个性质为:

如果 和 相互独立,即 不对 提供任何信息,此时的互信息为0。

对应分布为 的随机变量,熵 表示其最优编码长度。交叉熵是按照概率分布 的最优编码对其真实分布为 的信息进行编码的长度,定义为

在给定 的情况下,如果 和 越接近,交叉熵越小。

KL散度 ,是用概率分布 来近似 时所造成的信息损失量。KL散度是按照概率分布 的最优编码对真实分布为 的信息进行编码,其平均编码长度 和 的最优平均编码长度 之间的差异。对于离散概率分布 和 ,从 到 的KL散度定义为

KL散度可以是衡量两个概率分布之间的距离。KL散度是非负的。当两个分布越接近,KL散度值越小;如果两个分布越远,KL散度值越大。但KL散度并不是一个真正的度量或者距离:1、KL散度不满足距离的对称性;2、KL散度不满足距离的三角不等式性质。

JS散度 是一个对称的衡量两个分布的相似性的度量方式,定义为

JS散度是KL散度的一种改进。但两种散度都存在一个问题,即如果两个分布没有重叠或者重叠的很少,KL散度和JS散度都很难衡量两个分布分距离。

Wasserstein距离 也是衡量两个分布之间的距离。定义为

其中 是边际分布为 和 的所有可能的联合分布集合, 为 和 的距离。
如果两个分布看作两个土堆,联合分布 看作是从土堆 的位置 到土堆 的位置 的搬运土的数量,并有


和 为 的两个边界分布。
可以理解为在联合分布\\gamma(x,y)下把形状为 的土堆搬运到形状为 的土堆所需的工作量。

其中从土堆 的位置 到土堆 的位置 的移动土的数量何距离分别是 和 。因此,Wasserstein距离可以理解为搬运土堆的最小工作量,也是推土机距离。如下图所示。

Wasserstein距离的优势在于:即使两个分布没有重叠或者重叠很少,Wasserstein距离仍然能反映两个分布之间的远近。

4.keras-交叉熵的介绍和应用

keras-交叉熵的介绍和应用

1.载入数据以及预处理

import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import *
from keras.optimizers import SGD

import os

import tensorflow as tf

# 载入数据
(x_train,y_train),(x_test,y_test) = mnist.load_data()

# 预处理
# 将(60000,28,28)转化为(600000,784),好输入展开层
x_train = x_train.reshape(x_train.shape[0],-1)/255.0
x_test= x_test.reshape(x_test.shape[0],-1)/255.0
# 将输出转化为one_hot编码
y_train = np_utils.to_categorical(y_train,num_classes=10)
y_test = np_utils.to_categorical(y_test,num_classes=10)

2.创建网络打印训练结果

# 创建网络
model = Sequential([
    # 输入784输出10个
    Dense(units=10,input_dim=784,bias_initializer=‘one‘,activation=‘softmax‘)
])
# 编译
# 自定义优化器
sgd = SGD(lr=0.1)
model.compile(optimizer=sgd,
        # 运用交叉熵 loss=‘categorical_crossentropy‘, metrics=[‘accuracy‘]) model.fit(x_train,y_train,batch_size=32,epochs=10,validation_split=0.2) # 评估模型 loss,acc = model.evaluate(x_test,y_test,) print(‘ test loss‘,loss) print(‘test acc‘,acc)

out:

Epoch 1/10

32/48000 [..............................] - ETA: 2:43 - loss: 2.2593 - acc: 0.1562
1792/48000 [>.............................] - ETA: 4s - loss: 1.2642 - acc: 0.6579

......

......

Epoch 10/10

47456/48000 [============================>.] - ETA: 0s - loss: 0.2712 - acc: 0.9241
48000/48000 [==============================] - 2s 41us/step - loss: 0.2716 - acc: 0.9240 - val_loss: 0.2748 - val_acc: 0.9240

 

32/10000 [..............................] - ETA: 0s
2976/10000 [=======>......................] - ETA: 0s
6656/10000 [==================>...........] - ETA: 0s
10000/10000 [==============================] - 0s 17us/step

test loss 0.2802182431191206
test acc 0.9205

以上是关于熵的介绍的主要内容,如果未能解决你的问题,请参考以下文章

熵的介绍

信息熵的直观理解

学习笔记之信息量熵KL散度交叉熵的一些介绍

信息熵公式的由来(转)

决策树学习

信息熵