You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数据集计算条件熵结果大于原始熵的问题求助

错误原因
  • 核心错误出在conditional_entropy的遍历逻辑:条件熵公式要求遍历X、Y的所有唯一取值计算累加项,而你当前代码遍历的是X、Y的全部样本值,同一(x,y)组合会因为在样本中多次出现被重复累加,直接导致计算结果远超理论上限。
    以你的测试数据集为例,X序列(data[:,0])为[2,1,3,4,3,1,2],x=1、2、3各出现2次,对应的计算项会被重复加2次,相当于结果被不合理放大。
  • joint_probability存在隐含bug:函数内部循环边界用了全局变量data的长度,而非传入参数X的长度,当前场景下两者一致不报错,但如果后续传入其他序列会出现统计错误。
修正代码
import numpy as np
from math import log2

def probability(x: float, X: list) -> float:
    cnt = 0
    for w in X:
        if w == x: cnt += 1
    return cnt / len(X) 

def joint_probability(x: float, y: float, X: list, Y: list) -> float:
    assert len(X) == len(Y)
    cnt = 0
    # 修正:用传入的X长度做循环边界,不依赖全局data
    for i in range(len(X)):
        if X[i] == x and Y[i] == y: cnt += 1
    return cnt / len(X)

def conditional_entropy(X: list, Y: list) -> float:
    """Computes H(Y|X)"""
    h = 0
    # 修正:遍历X、Y的唯一值,避免重复计算
    unique_x = np.unique(X)
    unique_y = np.unique(Y)
    for x in unique_x:
        px = probability(x, X)
        if px <= 0:
            continue
        for y in unique_y:
            p_xy = joint_probability(x, y, X, Y)
            if p_xy != 0: 
                h += -p_xy * log2(p_xy / px)
    return h

# 熵计算函数,用于验证
def entropy(Y: list) -> float:
    h = 0
    unique_y = np.unique(Y)
    for y in unique_y:
        py = probability(y, Y)
        if py > 0:
            h += -py * log2(py)
    return h
验证结果

用你给出的数据集测试:

data = np.asarray([ 
        [2, 1, 1], 
        [1, 3, 1],
        [3, 1, 0], 
        [4, 3, 1],
        [3, 2, 0], 
        [1, 1, 1],
        [2, 2, 0]])

print(entropy(data[:, 2])) 
# 输出:0.9852281360342516
print(conditional_entropy(data[:, 0], data[:, 2])) 
# 输出:0.5566588862425102,小于H(Y),符合理论结论

内容的提问来源于stack exchange,提问作者John Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:36:02