list
(每一行中的最后一列为类别 label),我们可以直接用 eval(input())
将字符串转成 list
对象。math.log(p_k, 2)
求对数并累计求和。import math
# 读取输入数据(字符串转二维列表)
data = eval(input().strip())
# 获取数据集总样本数
total = len(data)
# 统计各类别样本个数
label_count = {}
for sample in data:
label = sample[-1] # 最后一列是类别
label_count[label] = label_count.get(label, 0) + 1
# 计算信息熵
entropy = 0.0
for count in label_count.values():
p = count / total # 该类别比例
if p > 0: # 避免 log(0)
entropy -= p * math.log(p, 2) # 累加公式
# 输出信息熵,保留三位小数
print(f"{entropy:.3f}")
某新零售食品连锁企业,利用先进的科技和数据分析来提供生鲜食品购物体验,决策树是一种机器学习算法,可以在不同场景中发挥作用,帮助优化业务决策和提高效率。信息熵是决策树中非常重要的一个概念,请根据输入描述和输出描述中的要求,编程实现信息熵的计算。
提示:计算某一数据集的信息熵,可以使用 H(D)=−∑k=1k∣D∣∣Ck∣log2∣D∣∣Ck∣,
其中 ∣Ck∣,代表的是属于某一类的样本个数,D 是整个数据集的样本数量,根据某一特征的不同取值可以将数据划分为 D1,D2...Dn ,故有 ∑i=1n∣Di∣=∣D∣ 。K 为别的类别的数目。
输入的数据集为一个二维 list ,该二维 list 中每一个子 list 的最后一个元素表示当前样本的 label , label 为 0 表示负样本,1 表示正样本,其余的元素表示特征的值,每一列都表示一个固定的特征,例如,第一列特征可以表示收入层级,第二列特征可以表示是否有车等,形如 [[0,1,0,0,′0′],[2,0,0,1,′1′]]。为了方便区别,label 以 String 的数据形式进行存储。
为了便于使用,所有案例都以单行的形式传入,因此形如sys.stdin 等方法结合 for 循环和 eval 函数即可读取并还原数据。
要求给出在既定数据集下,输出对应的信息熵的值,返回值结果为 float 形式,保留小数点后 3 位有效数字。
(1)请严格按照返回值的要求设置返回值的格式,保证返回值的唯一性。
(2)可以使用形如 numpy 和 pandas 等自带代码库。
(3)math 库中含有 log 计算方法。
输入
[[0,0,0,0,'0'],[0,0,0,1,'0'],[0,1,0,1,'1'],[0,1,1,0,'1'],[0,0,0,0,'0'], [1,0,0,0,'0']]
输出
0.918
说明
保留小数点后三位有效数字后,数据集下的信息熵为 0.918