老规矩,Talk is cheap, show me your code.
#-*-coding:utf-8-*- from math import log def calcShannonEnt(datsSet): #长度 numEntries = len(dataSet) #字典统计 labelCounts = {} #遍历特征 for featVec in dataSet: #最后一维特征(分类) currentLabel = featVec[-1] #如果不在字典中,则添加进字典 #可以写成labelCounts[labelCount] = labelCounts.get(currentLabel,0) + 1 if currentLabel not in labelCounts.key(): labelCounts[currentLabel] = 0 labelCounts[currentLabel] += 1 #信息增益 shannonEnt = 0.0 #对于每一个分类 for key in labelCounts: #概率,也就是这个分类出现的次数除以总共的分类数量 prob = float(labelCounts[key])/numEntries #计算熵 概率*以二为底概率的对数 shannonEnt -= prob * log(prob,2) return shannonEnt
这段代码很简单,可能对于最后几句话理解起来有些困难。那我们一起来分析一下。
什么是信息增益和熵呢?学过信息论的同学肯定知道,那么对于没有学过的同学呢?不要着急,我们一起来看看。
首先 信息增益和熵是一回事,就是一个事情两个名字而已。那么什么是熵呢?
熵就是信息的期望值,在信息世界,熵越高,则能传输越多的信息,熵越低,则意味着传输的信息越少。ok,那么什么是信息呢?是如何用数学语言描述呢?信息的定义就是:
-ln(p)
很简单是不,那么我们应该怎么理解呢?首先p代表某个分类出现的概率。比如,均匀色子出现6的概率为1/6,硬币正面朝上的概率为1/2。那么又为什么取对数呢?
时间: 2024-10-13 15:39:01