信息熵计算公式:
单个信息的熵为:
数据集存在多个类别的信息,数据集的信息熵为:
n表示n个类别;表示第i个类别出现的概率;
计算数据集信息熵
1.准备数据集 下载地址IRIS鸢尾花数据集(多种格式)-下载地址_鸢尾花数据集下载-CSDN博客
2.将数据集从文件中读取出来,分为特征集和标签集
3.创建一个数据字典,以标签为键,标签个数为对应值。如果找不到标签,就要扩建数据集字典,加入该键,并记录当前类别出现的次数;如果已有标签,就在原有基础上加1
4.按键遍历标签集,根据公式计算信息熵
import numpy as np
def calculate_entropy(data):
# 统计每个值的出现次数
freq = {}
for val in data:
#freq.get(val, 0)
#如果val存在于字典freq则返回val对应的值,否则返回0
freq[val] = freq.get(val, 0) + 1
print("第1类:",freq[1])
print("第2类:",freq[2])
print("第3类:",freq[3])
# 计算概率和信息熵
entropy = 0.0
total = len(data)
print("total",total)
for key in freq:
prob = freq[key] / total
entropy -= prob * math.log(prob,2)
return entropy
ef file2matrix(filename):
#打开文件
fr = open(filename)
#读取文件所有内容
arrayOLines = fr.readlines()
#得到文件行数
numberOfLines = len(arrayOLines)
#返回的NumPy矩阵,解析完成的数据:numberOfLines行,3列
returnMat = np.zeros((numberOfLines,4))
#返回的分类标签向量
classLabelVector = []
#行的索引值
index = 0
for line in arrayOLines:
#s.strip(rm),当rm空时,默认删除空白符(包括'\n','\r','\t',' ')
line = line.strip()
#使用s.split(str="",num=string,cout(str))将字符串根据'\t'分隔符进行切片。
listFromLine = line.split(' ')
#打乱数据
# listFromLine = shuffle_columns(listFromLine)
#将数据1-4列提取出来,存放到returnMat的NumPy矩阵中,也就是特征矩阵
returnMat[index,:] = listFromLine[1:5]
#进行分类
if listFromLine[-1] == '"setosa"':
classLabelVector.append(1)
elif listFromLine[-1] == '"versicolor"':
classLabelVector.append(2)
elif listFromLine[-1] == '"virginica"':
classLabelVector.append(3)
index += 1
return returnMat, classLabelVector
# 示例数据
# 示例数据
filename = "iris.txt"
data,label = file2matrix(filename)
print(label)
# 计算信息熵
entropy = calculate_entropy(label)
print("信息熵: ", entropy)