python读取鸢尾花数据集并进行训练测试集分割

来源:互联网 发布:锤子电梯破解软件 编辑:程序博客网 时间:2024/05/22 06:19

数据分割时遇到一些list方面问题,在此记录,谨防下次出现类似错误!

# -*- coding: utf-8 -*-from numpy import *import operatorfrom os import listdir# x,y=getDataSet('iris.data.txt',4)#tr1,tr2,ts1,ts2 = dataDiv(x,y)def getDataSet(filename,numberOfFeature):       #将数据集读入内存      fr = open(filename)    numberOfLines = len(fr.readlines())         #get the number of lines in the file  file.readlines()是把文件的全部内容读到内存,并解析成一个list    returnMat = zeros((numberOfLines,numberOfFeature))        #prepare matrix to return  3代表数据集中特征数目###    classLabelVector = []                       #prepare labels return       fr = open(filename)    index = 0    for line in fr.readlines():        line = line.strip()                    #strip() 参数为空时,默认删除空白符(包括'\n', '\r',  '\t',  ' ')        listFromLine = line.split(',')         #split 以什么为标准分割一次  分成数组中的每个元素        returnMat[index,:] = listFromLine[0:numberOfFeature]         #classLabelVector.append(int(listFromLine[-1]))   #append() 方法向列表的尾部添加一个新的元素        if listFromLine[-1] == 'Iris-setosa' :            classLabelVector.append(1)        elif listFromLine[-1] == 'Iris-versicolor' :            classLabelVector.append(2)        else:        #elif listFromLine[-1] == 'Iris-virginica' :            classLabelVector.append(3)        index += 1    return returnMat,classLabelVector    def dataDiv(inMat,classVector):    <span style="color:#ff0000;">#注意!!!!!!!  trainData[i,:] = inMat[i,:] list类型这样操作错误#  TypeError: list indices must be integers, not tuple#访问二维数组inMat的第i行  不能写成inMat[i,:]是错误的;正确应是inMat[i][:], # 而numpy中定义的array变量可以通过inMat[i,:]访问  注意list和array区别</span># 鸢尾花数据集共三类,每类50个数据,50(35训练集 / 15测试集)    #方法一  #    trainData = []     #    trainLabel = []#    testData = []#    testLabel = []#    for i in range(0,35)   :  #        trainData.append(inMat[i][:])#        trainLabel.append(classVector[i])#    for i in range(0,35)    :#        trainData.append(inMat[50+i][:])#        trainLabel.append(classVector[50+i])#    for i in range(0,35)    :#        trainData.append(inMat[100+i][:])#        trainLabel.append(classVector[100+i])#        #    for i in range(0,15)  :#        testData.append(inMat[35+i][:])#        testLabel.append(classVector[35+i])#    for i in range(0,15)  :#        testData.append(inMat[85+i][:])#        testLabel.append(classVector[85+i])#    for i in range(0,15)  :#        testData.append(inMat[135+i][:])#        testLabel.append(classVector[135+i])         # 方法二    trainData = zeros((105,4))    trainLabel = zeros((105,4))    testData = zeros((45,4))    testLabel = zeros((45,4))    index = 0         trindice = range(0,35)+range(50,85)+range(100,135)          tsindice = range(35,50)+range(85,100)+range(135,150)       <span style="color:#ff0000;">#不能写成 [range(0,35)+range(50,85)+range(100,135)]     不能加两个方括号    # 比如 [range(0,5)+range(8,10)] 代表 一个list类型变量 size=1 里面存了一个7维list       #      range(0,5)+range(8,10) 代表 一个list类型变量 size=7     #ValueError: could not broadcast input array from shape (105,4) into shape (4)</span>         for i in trindice  :          trainData[index] = inMat[i]        trainLabel[index] = classVector[i]        index+=1    index = 0        for i in  tsindice :        testData[index] = inMat[i]        testLabel[index] = classVector[i]        index+=1    #方法一和方法二实现的功能一致  但数据存放格式存在差别,方法一存放为list类型,方法二存放为arry类型                return trainData,trainLabel,testData,testLabel


1 0