比较两个方式:
使用列表和使用数据框来计算熵的差异
def createDataSet():
dataSet =[[1,1,'yes'],
[1,1,'yes'],
[1,0,'no'],
[0,1,'no'],
[0,1,'no'],
]
labels = ['no sufacing', 'flippers']
return dataSet, labels
myDat, labels = createDataSet()
from math import log
#计算标签的熵的大小
def calcShannonEnt(dataSet):
numEntries = len(dataSet) #统计行数
#print(numEntries)
labelCounts = {}
for featVec in dataSet: #取每一行样本
currentLabel = featVec[-1]
if currentLabel not in labelCounts.keys():
labelCounts[currentLabel] = 0
labelCounts[currentLabel] += 1
shannonEnt = 0
for key in labelCounts:
prob = float(labelCounts[key])/numEntries
shannonEnt -= prob * log(prob, 2)
return shannonEnt
shannonEnt=calcShannonEnt(myDat)
#使用pd来计算
import pandas as pd
import numpy as np
def calcShannonEnt1(dataSet, label_colnum):
dat = pd.DataFrame(dataSet).rename(columns={label_colnum: 'label'})
label_dat = dat['label'].value_counts().reset_index()
label_dat['label'] = label_dat['label'].astype(float)
label_dat['label_prob']= label_dat['label']/ (label_dat['label'].sum())
log_probs = np.log2(label_dat['label_prob'])
shannonEnt = -1 *(label_dat['label_prob'] * log_probs).sum()
return shannonEnt
#调用
shannonEnt=calcShannonEnt1(myDat,label_colnum=2)
shannonEnt



