熵的介绍
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
以上是关于熵的介绍的主要内容,如果未能解决你的问题,请参考以下文章