【机器学习】信息熵和信息度量

文章介绍了信息熵的基本概念,包括其在概率分布不确定性中的作用,以及在决策树、逻辑回归等机器学习算法中的应用。联合熵和条件熵作为衡量多个变量不确定性的工具,被用来分析数据集中的信息量。交叉熵则衡量了两个概率分布的差异,常用于模型评估。KL散度作为相对熵,衡量分布间的差异,其在数据预处理、文本压缩和NLP模型如变分自动编码器中有重要应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、说明

        信息熵是概率论在信息论的应用,它简洁完整,比统计方法更具有计算优势。在机器学习中经常用到信息熵概念,比如决策树、逻辑回归、EM算法等。本文初略介绍一个皮毛,更多细节等展开继续讨论。

二、关于信息熵的概念 

2.1 要素描述

        信息熵:熵是一种测量随机变量 X 的不确定性/随机性的方法。它有几个要素:

  • 1)针对一个数据分布,现实中,是一组同母体的数据采样。
  • 2)是对自身内部数据的不确定度量,这种度量是期望。
  • 3)对于所有的分布,均匀分布不确定程度最大,没有更大的不确定性。
  • 4)高斯分布不确定性程度最小,因为高斯分布有明确的核心,因此,很确定它就是一组μ附近的数据。

2.2 信息熵的数学表示:

    1   连续概率分布:

                S =- \int f(x)*log(\frac{1}{f(x)}) dx

    2   离散概率分布

        S =- \sum_i^n p(i)*log(\frac{1}{p(i)})

2.3 联合熵(Joint Entropy)

         一对离散随机变量 X, Y ~ p (x, y) 的联合熵是指定它们的值平均所需的信息量。

        联合熵是联合概率分布的不确定性或随机性的度量。它用于量化两个或多个随机变量一起包含的信息量。换句话说,联合熵是对由多个变量组成的系统中存在多少不确定性的度量。它通常用于信息论、通信理论和信号处理中,以评估信号或数据集中的信息量。在数学上,联合熵定义为所有可能结果的概率乘以它们的对数(以 2 为底)的负和。对于两个随机变量 X 和 Y,用 H(X,Y) 表示。

 性质:

1)非负性

2)整体大于局部:(整体信息不确定程度大于局部)

 3)整体熵小于局部之和

2.4 条件熵(Conditional Entropy

        条件熵:给定另一个 X 的随机变量 Y 的条件熵表示,在假定另一方知道 X 的情况下,一个人平均仍需要提供多少额外信息来传达 Y。

 注意:条件熵也可以看成p(x,y)和p(x)的相对熵,也就是p(x,y)和p(x)的距离。

2.5 示例: 计算公平硬币的熵 

 

        这里,公平硬币的熵最大,即 1。随着硬币偏差的增加,信息/熵减少。下面是熵与偏差的关系图,曲线如下所示:

2.6 交叉熵:

        交叉熵是给定随机变量或事件集的两个概率分布(p 和 q)之间差异的度量。换句话说,交叉熵是当我们使用模型 q 时对分布源 p 的数据进行编码所需的平均位数。

三、Kullback-Leibler 散度

3.1 KL散度定义

        KL 散度是给定随机变量或事件集的两个概率分布之间的相对差异的度量。 KL 散度也称为相对熵。可以通过以下公式计算:

3.2 ​交叉熵和 KL 散度之间的区别 

        交叉熵计算表示分布 q 中的事件所需的总分布,而不是 p ,而 KL 散度表示表示分布中的事件所需的额外位数q 而不是 p。

3.3 KL 散度的性质

  1. D(p || q) 始终大于或等于 0。
  2. D(p || q) 不等于 D(q || p)。 KL 散度不具有交换性 。
  3. 如果 p=q,则 D(p || q) 为 0。

四、示例和实现 

        假设有两个盒子,里面装有 4 种类型的球(绿、蓝、红、黄)。从盒子中随机抽取一个具有给定概率的球。我们的任务是计算两个框的分布差异,即 KL 散度。

代码:解决这个问题的Python代码实现。

# box =[P(green),P(blue),P(red),P(yellow)]

box_1 = [0.25, 0.33, 0.23, 0.19]

box_2 = [0.21, 0.21, 0.32, 0.26]

import numpy as np

from scipy.special import rel_entr

def kl_divergence(a, b):

    return sum(a[i] * np.log(a[i]/b[i]) for i in range(len(a)))

   

print('KL-divergence(box_1 || box_2): %.3f ' % kl_divergence(box_1,box_2))

print('KL-divergence(box_2 || box_1): %.3f ' % kl_divergence(box_2,box_1))

# D( p || p) =0

print('KL-divergence(box_1 || box_1): %.3f ' % kl_divergence(box_1,box_1))

print("Using Scipy rel_entr function")

box_1 = np.array(box_1)

box_2 = np.array(box_2)

print('KL-divergence(box_1 || box_2): %.3f ' % sum(rel_entr(box_1,box_2)))

print('KL-divergence(box_2 || box_1): %.3f ' % sum(rel_entr(box_2,box_1)))

print('KL-divergence(box_1 || box_1): %.3f ' % sum(rel_entr(box_1,box_1)))

Output:

KL-divergence(box_1 || box_2): 0.057 
KL-divergence(box_2 || box_1): 0.056 
KL-divergence(box_1 || box_1): 0.000 
Using Scipy rel_entr function
KL-divergence(box_1 || box_2): 0.057 
KL-divergence(box_2 || box_1): 0.056 
KL-divergence(box_1 || box_1): 0.000 

五、KL散度的应用:

        熵和 KL 散度有许多有用的应用,特别是在数据科学和压缩方面。

        熵可用于数据预处理步骤,例如特征选择。例如,如果我们想根据主题对不同的 NLP 文档进行分类,那么我们可以检查文档中出现的不同单词的随机性。 “计算机”一词出现在技术相关文档中的可能性更大,但“the”一词则不然。
熵还可以用于文本压缩和量化压缩。包含某种模式的数据比随机的数据更容易压缩。
        KL 散度还用于许多 NLP 和计算机视觉模型(例如变分自动编码器)中,以比较原始图像分布和从编码分布生成的图像分布。

### 信息熵信息增益的概念 #### 信息熵 信息熵是对不确定性的一种度量,在机器学习中用来量化数据集中的混乱程度或纯度。对于给定的数据分布,如果所有类别都均匀分布,则该系统的熵最大;反之,当某一类别的概率接近1而其他类别趋近于0时,此时的熵最小。 具体而言,假设有一个离散型随机变量\(X\)取值范围为\(\{x_1, x_2,...,x_n\}\),其对应的概率分别为\({p(x_1), p(x_2),...,p(x_n)}\),那么这个随机事件的信息熵定义如下: \[H(X)=-\sum_{i=1}^{n}{p(x_i)\log _b {p(x_i)}} \] 其中底数\(b\)通常选作2,这样得到的结果单位就是比特(bit)[^2]。 #### 信息增益 信息增益衡量的是通过某个特征划分样本集合所能获得的知识增长量。简单来说就是在构建决策树过程中,选择最佳属性作为节点的标准之一——即哪个属性能够使得子结点更加纯净(减少不纯度)。计算方法是父节点的熵减去各分支加权后的平均熵之差。 设某数据集中存在多个可能的目标分类标签T={t₁,t₂,…tk}, 对应的概率分别是P(t₁), P(t₂)...P(tk). 如果按照某种条件A将这些记录分为若干组S₁,S₂...Sm, 则可以得出关于此分割方式下的期望熵E(S|A): \[IG(T,A)=Entropy(T)-\sum_{v∈Values(A)}{\frac{|S_v|}{|S|}×Entropy(S_v)}\] 这里 \(Entropy(T)\) 表示原始未分隔状态的整体熵; 而第二项代表依据特定属性 A 进行切分之后所形成的各个部分 Sᵥ 的总权重乘以其各自的局部熵 Entropy(Sᵥ). ### 应用场景 在实际应用当中,信息熵广泛应用于监督式学习里的分类问题解决上,特别是决策树模型里边最为典型。例如 ID3 C4.5 决策树算法均采用基于信息论的方法来挑选最优分裂准则,从而实现高效准确地预测未知实例所属类别[^1]. ```python from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier import pandas as pd # 加载鸢尾花数据集 data = load_iris() df = pd.DataFrame(data.data, columns=data.feature_names) y = data.target # 创建并训练决策树模型 (默认使用信息熵作为质量标准) clf_entropy = DecisionTreeClassifier(criterion="entropy", random_state=1234) # 训练模型 model = clf_entropy.fit(df, y) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无水先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值