#ID3算法
def ID3_chooseBestFeatureToSplit(dataset):numFeatures=len(dataset[0])-1baseEnt=jisuanEnt(dataset)bestInfoGain=0.0bestFeature=-1for i in range(numFeatures): #遍历所有特征#for example in dataset:#featList=example[i] featList=[example[i]for example in dataset]uniqueVals=set(featList) #将特征列表创建成为set集合,元素不可重复。创建唯一的分类标签列表newEnt=0.0for value in uniqueVals: #计算每种划分方式的信息熵subdataset=splitdataset(dataset,i,value)p=len(subdataset)/float(len(dataset))newEnt+=p*jisuanEnt(subdataset)infoGain=baseEnt-newEnt
# print(u"ID3中第%d个特征的信息增益为:%.3f"%(i,infoGain))if (infoGain>bestInfoGain):bestInfoGain=infoGain #计算最好的信息增益bestFeature=ireturn bestFeature
#利用ID3算法创建决策树
def ID3_createTree(dataset,labels):classList=[example[-1] for example in dataset]if classList.count(classList[0]) == len(classList):# 类别完全相同,停止划分return classList[0]if len(dataset[0]) == 1:# 遍历完所有特征时返回出现次数最多的return majorityCnt(classList)bestFeat = ID3_chooseBestFeatureToSplit(dataset)bestFeatLabel = labels[bestFeat]
# print(u"此时最优索引为:"+(bestFeatLabel))ID3Tree = {bestFeatLabel:{}}# print(bestFeatLabel)del(labels[bestFeat])# 得到列表包括节点所有的属性值featValues = [example[bestFeat] for example in dataset]uniqueVals = set(featValues)for value in uniqueVals:subLabels = labels[:]#################################递归sub_dataset=splitdataset(dataset, bestFeat, value)ID3Tree[bestFeatLabel][value] = ID3_createTree(sub_dataset, subLabels)print(ID3Tree)return ID3Tree