郑捷 机器学习算法与编程实践 --ID3决策树 python3 代码

在此仅将原文代码要做的修改附上

修改前 '''def loadDataSet(self,path,labels):
        d="/t"
        d=d.encode(encoding="utf-8")
        recordlist=[]
        fp=open(path,"rb")
        content=fp.read()
       # print(content)
        fp.close()
        rowlist=content.splitlines()
        print(rowlist)
        recordlist=[row.split(d)for row in rowlist if row.strip()]
        print(recordlist)
        self.dataSet=recordlist

        self.labels=labels

'''出错主要是recordlist=[row.split(d)for row in rowlist if row.strip()]会提示d类型错误,为此笔者将d强制转换后可运行,但发现self.dataSet所构成的列表阵列打印出来'0\t0\t0\t0\tno'形如此,其长度为1,表现为一个字符串,并不是文中想得到的[0.0, 0.0, 0.0, 0.0, 'no']这种形式的列表,所以后边计算都是错的,无法得出书本上的答案。考虑到这,将主要矛头对准这个loadData函数,查阅类似读取文件数据博客,资料,均未找到直接将 0 0 0 0 no这样的文本读出来并作为列表的代码,在翻看list相关资料时候看到列表相加便可得到所求列表,于是做以下尝试

    将文本数据的数据信息与英文字符分开存储,数据字符先采用矩阵存储,然后利用tolist()函数转换为list 然后与英文列表相加实现所求形式的列表,最终得解,具体如下

def loadDataSet(self,path,labels):

        fp = open(path)
        lines= fp.readlines() #逐行读取文件
        numberOfLines = len(lines) #获取文件的行数
        returnMat = zeros((numberOfLines,4)) #创建一个矩阵
        decVector = []       #存储决策标签向量
        index = 0
        for line in lines:
            line = line.strip() #删除所有换行符
            listFromLine = line.split('\t') #通过指定分割符对字符串切分
            returnMat[index,:]=listFromLine[0:4]
            classLabelVector.append((listFromLine[-1]))
            index+=1
        Matrix=returnMat.tolist()
        index1=0;
        for i in range(numberOfLines):
            Matrix[index1]+=[classLabelVector[index1]];#[]必须加
    #将classLabelVector[index]取出来的元素转换为列表然后完成相加否则报错
            index1+=1
        self.dataSet=Matrix
        self.labels=labels
至此修改完毕,个人见解,如有其它简便方法,求留言指正

你可能感兴趣的:(pyer)