一.定义
香农熵定义为信息的期望值。在信息论与概率统计中,熵是表示随机变量不确定性的度量。
假定当前样本集合D中一共有n类样本,第i类样本为Xi,那么Xi的信息定义为:
举例:
若小明和小华下棋,两人势均力敌,则信息熵H = -((1/2) log2 (1/2) + (1/2) log2 (1/2)) = 1bit。
二.计算
香农熵的计算公式为:
香农熵的值越小,则表明D的不纯度越低。
三.代码实现
计算香农熵的python函数实现:
# 计算香农熵def calEnt(dataSet):n = dataSet.shape[0] # 数据集总行数iset = dataSet.iloc[:, -1].value_counts() # 标签的所有类别p = iset / n # 每一类标签所占比ent = (-p * (np.log2(p))).sum()return ent
假设有如下数据集,试着实现计算香农熵的python代码。
代码:
import pandas as pdimport numpy as np# 计算香农熵def calEnt(dataSet):n = dataSet.shape[0] # 数据集总行数iset = dataSet.iloc[:, -1].value_counts() # 标签的所有类别# print(iset)'''no3yes 2Name: fish, dtype: int64'''p = iset / n # 每一类标签所占比'''no0.6yes 0.5Name: fish, dtype: int64'''ent = (-p * (np.log2(p))).sum()return ent# 创建数据集def createDataSet():row_data = {'no surfacing': [1, 1, 1, 0, 0],'flippers': [1, 1, 0, 1, 1],'fish': ['yes', 'yes', 'no', 'no', 'no']}dataSet = pd.DataFrame(row_data)return dataSetif __name__ == "__main__":dataSet = createDataSet()print(calEnt(dataSet))# 0.9709505944546686