def majorityCnt(classList):#传入的参数是已经划分完所有特征之后的数据集,例如[['yes'],['yes'],['maybe']]
classCount={}#创建一个字典
for vote in classList:
if vote not in classCount.keys():classCount[vote] = 0
classCount[vote] += 1
#根据上述循环和例子,可以得出{'yes':2,'maybe':1}
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=Ture)
return sortedClassCount[0][0]
重点不明白
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=Ture)
使用iteritems()这个函数得到我们字典中的所有元素,就是键-值对{‘yes’:2,’maybe’:1}
之后定义一个叫做key的函数,这个名字可以任意取,key只是习惯性定义的
之后通过itemgetter函数对字典中的元素进行排序,operator.itemgetter(1)表示按照元素的第二个进行排序,指按键-值对的值来排,也就是分类出现的多少。
reverse=True 表示按照递减的顺序来排序,即降序。
sortedClassCount[0][0]表示的是按照分类的个数最多的元素的那个类。
补了一下python里的字典概念
一个简单的字典
alien_0 = {'color':'green','points':5}
print(alien_0['color'])
print(alien_0['points'])
结果green 5
字典是一系列的键-值对。每一个键都与一个值相关联。
构建树的函数代码
def createTree(dataSet,labels):
classList = [example[-1] for example in dataSet]#取出最后一列
if classList.count(classList[0]) == len(classList):
return classList[0]
#类别完全相同则停止继续划分,count()函数中接受一个参数,表示的是这个参数在某个序列中出现的次数
#如果这个classList中的元素完全相同,那么这个参数的count(classList[0])应该是等于classList的长度
if len(dataSet[0]) == 1:
return majorityCnt(classList)
bestFeat = chooseBestFeatureToSplit(dataSet)#返回的是最好的特征的位置,例如0
bestFeatLabel = labels[bestFeat]#存储的是最好的特征的标签
myTree = {bestFeatLabel:{}}#构建数据字典
del(labels[bestFeat])#删除最佳特征值
featValues = [example[bestFeat] for example in dataSet]#找出最佳特征向量对应的所有特征值
uniqueVals = set(featValues)#除去重复数据
for value in uniqueVals:
subLabels = labels[:]
myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet,bestFeat,value),subLabels)
return myTree
>>> import trees
>>> from imp import reload
>>> reload(trees)
<module 'trees' from 'E:\\Python\\trees.py'>
>>> myDat,labels=trees.createDataSet()
>>> myTree = trees.createTree(myDat,labels)
>>> myTree
{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}
>>>