参考:信息熵的公式推导https://www.zhihu.com/question/22178202/answer/161732605
一、信息熵公式:
样本数据
二、信息熵的计算
约等于0.970954
信息熵的代码实现
import math
def informationEntropy(dataset):
nums = len(dataset) #样本的数量
lables = {} #用来记录结果集
for samples in dataset:
if samples[-1] not in lables:
lables[samples[-1]] = 1
else:
lables[samples[-1]] += 1
ents = 0.0
for key in lables.keys():
ff = lables[key] / nums
ents -= ff* math.log(ff,2)
return ents
dataset = [[1,1,1],[1,1,1],[1,0,0],[0,1,0],[0,1,0]]
print(dataset)
print(informationEntropy(dataset))
其中dataset是样本集
三、信息增益
关于信息增益可以根据代码来看。
def splitDataSet(dataSet,axis,value):
retDataSet = []
for featVec in dataSet:
if featVec[axis] == value:
reducedFeatVec = featVec[:axis]
reducedFeatVec.extend(featVec[axis+1:])
retDataSet.append(reducedFeatVec)
return retDataSet
def chooseBestFeatureToSplit(dataset):
numFeatures = len(dataset[0]) - 1
baseEntropy = informationEntropy(dataset)
bestInfoGain = 0.0
bestFeature = -1
for i in range(numFeatures):
feaList = [example[i] for example in dataset]
uniqueVals = set(feaList)
newEntropy = 0.0
for value in uniqueVals:
subDataset = splitDataSet(dataset, i, value)
print("subdataset:", subDataset)
prob = len(subDataset) / float(len(dataset))
newEntropy += prob * informationEntropy(subDataset)
print("newEntropy", newEntropy)
infoGain = baseEntropy - newEntropy
print(i, "--", infoGain)
if bestInfoGain < infoGain:
bestInfoGain = infoGain
bestFeature = i
return (bestInfoGain, i)
print(chooseBestFeatureToSplit(dataset))
信息增益计算解析:
numFeatures = 2 也就是两个属性,一个是颜色,一个是形状。
baseEntropy->信息熵。bestInfoGain->记录最佳信息增益. bestFeature->记录最佳信息增益的属性列
下面for循环【 for i in range(numFeatures):】是遍历每个属性,,计算出每个属性对应的信息增益。
uniqueVals是每个属性的数量。例如红不红,只有两个情况,1或者0, 这里没有考虑绿色,青色,红色,白色等等。仅仅考虑两种红不红。
uniqueVals = {0,1}. 简单记录为 { 不红= 0, 红 = 1}
splitDataSet 的计算,
三个参数,第一个参数是元数据,第二个参数是属性列,第三个参数是属性列对应的属性值。
当苹果为不红的时候也就是取0的时候,求出splitDataSet = [[1,0],[1,0]]
首先将苹果是否红这列属性去掉,然后仅仅取苹果为0(不红)的时候的两行,也就是最后两行
剩下就是根据公式计算。
注意:
信息增益越大越好。