机器学习实战是ML的经典读物,作者用Python实现了机器学习的经典算法,这里对大家在网上问的比较多的,熵的实现进行注解。也为了自己回头梳理。熵在一定程度代表了时间的不确定性
from math import log
import operator
#创建一个数据集合,以列表形式,集合元素同样是列表,元素最后一项是标签,
def createDataSet():
dataSet=[[1,1,'yes'],
[1,1,'yes'],
[1,0,'no'],
[0,1,'no'],
[0,1,'no']]
#一个标签列表
labels=['no surfacing','flippers']
#创建数据集返回集合,和标签集合
return dataSet,labels
def calcShannonEnt(dataSet):
#获得数据集长度,也就是数据集有多少记录,为计算概率的
numEntries=len(dataSet)
#创建一个标签计数的字典集合,其中以键值对为元素。初始为空
labelCounts={}
#遍历数据集合,获得集合中的每一个元素列表
for featVec in dataSet:
#取得列表最后一个标签值,yes no 作为当前标签
currentlabel=featVec[-1]
#如果标签集合没有这个label就将此key也就是label对应的value设置为0
if currentlabel not in labelCounts.keys():
labelCounts[currentlabel]=0
#如果标签集合存在 这个label就计一次1 (此标签集合的形式是key是lebel value是出现次数)
labelCounts[currentlabel]+=1
#熵的初始化
shannonEnt=0.0
#获得标签集合的每一个标签
for key in labelCounts:
#获得标签的概率 ,numEntries为原始集合的长度
prob=float(labelCounts[key])/numEntries
#熵的计算公式
shannonEnt -= prob * log(prob,2)
return shannonEnt
def splitDataSet(dataSet,axis,value):