数据集计算条件熵结果大于原始熵的问题求助
错误原因
- 核心错误出在
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
相关产品推荐
相关产品推荐

