1. 算法分析: A. ,把数据集的最后一列变为1,2,3,并转换为csv格式。本来没有定义一个TreeNode的类,结果写起来及其复杂,在同学的建议下,建立了一个TreeNode的头文件。 class TreeNode: dim=0 p=0 left=0 right=0 value =0 def getdim(self): return self.dim def getp(self): return p def setdim(self,a): self.dim =a def setLeft(self,tree): self.left=tree def getLeft(self): return self.left def setRight(self,tree): self.right =tree def getRight(self): return self.right def setValue(self,va): self.value =va def getValue(self): return self.value
B. 读取csv文件,将它们存在一个dataset的list中: def loadcsv(filename): file =csv.reader(open(filename,"rt")) dataset =list(file) for i in range(len(dataset)): dataset[i] =[float(x) for x in dataset[i]] return dataset
C. 计算给定数据集的香农熵ENt =-p*log2p:
def Shannonent(dataset): numEnt =len(dataset) labelCounts ={} shannonEnt =0 for i in range(len(dataset)): currentlabel =dataset[i][-1] if currentlabel not in labelCounts.keys(): labelCounts[currentlabel]=0 labelCounts[currentlabel] +=1
for key in labelCounts: prob =float(labelCounts[key])/numEnt shannonEnt -= prob* log(prob,2) return shannonEnt
D. 进行数据集的划分,此处借鉴了机器学习实战的离散数据划分的方法,改成了连续数据的划分,dataset为待划分的数据集,axis为要划分的特征,value为特征的返回值也就是信息增益最大的划分点,输出为以该点为划分的左半边数据和右半边数据,看了机器学习实战上,采用了extend方法:
def |