机器学习实战-2.2文件中解析数据

    科技2025-07-08  9

    从文本中解析数据

    import numpy as np def filematrix(filename): fr = open(filename) arrayOLines = fr.readlinea() numberOfLines = len(arrayOLines)#得到文件行数 returnMat = np.zeros((numberOfLines,3))#返回来一个给定形状和类型的用0填充的数组 classLabelVector = [] index = 0 for line in arrayOLines: line = line.strip()#移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。截取所有的回车字符 listFromLine = line.split('\t')#通过指定分隔符对字符串进行切片 returnMat[index,:] = listFromLine[0:3]#选取前三个元素,将它们存储到特征矩阵中。 classLabelVector.append(int(listFromLine(-1)))#用于在列表末尾添加新的对象。使用-1表示列表中最后一列元素 index += 1 return returnMat,classLabelVector datingDataMat,datingLabels = file2matrix('datingTestSet.txt')#读入datingTestSet文本文件

    分析数据: 使用matplotlib创建散点图

    import matplotlib as plt fig = plt.figure() ax = fig.add_subplot(111)#位置是由三个整型数值构成,第一个代表行数,第二个代表列数,第三个代表索引位置。 ax.scatter(datingDataMat[:,1], datingDataMat[:,2])#scatter散点图 使用datingDataMat矩阵的第二、第三列数据 plt.show()

    Matplotlib库提供的scatter函数支持个性化标记散点图上的点

    ax.scatter(datingDataMat[:,1], datingDataMat[:,2],15.0array(datingLabels), 15.0array(datingLabels))

    归一化数据:

    import numpy as np def autoNorm(dataSet): minVals = dataSet.min(0)#从列中选取最小值 maxVals = dataSet.max(0)#从列中选取最大值 ranges = maxVals - minVals#计算可能的取值范围 normDataSet = np.zeros(np.shape(dataSet)) #获得dataSet的维数生成为dataset维的0矩阵 m = dataSet.shape[0]#获得dataSet的行数 normDataSet = dataSet - np.tile(minVals,(m,1))#生成m行1列MinVals的矩阵,再由dataSet逐行相减 normDataSet = normDataSet/np.tile(ranges,(m,1)) return normDataSet,ranges,minVals

    公式是newValue = (oldValue-min)/(max-min),可以将任意取值范围的特征值转化为0到1区间内的值。

    测试算法:作为完整程序验证分类器

    def datingClassTest(): hoRatio = 0.10 datingDataMat, datingLabels = file2matrix('datingTestSet.txt') normMat, range, minVals = autoNorm(datingDataMat) #归一化 m = normMat.shape[0] numTestVecs = int(m*hoRatio) errorCount = 0.0 for i in range(numTestVecs): #测试集 从0到numTestVecs classifierResult = classify0(normMat[i,:], normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3) #切片操作 normMat[i,:]是测试集,normMat[numTestVecs:m,:]是训练集取剩余的数据,标签变量从numTestVecs到最后一行,k=3 print(classifierResult, datingLabels[i]) if(classifierResult != datingLabels[i]): errorCount += 1.0 print(errorCount/float(numTestVecs)) #错误计数器的结果除以数据点总数即是错误率

    normMat[numTestVecs:m,:]

    对于X[m:n,:]

    是以行为主取二维数组中第m维,第n-1维的所有数据

    测试X[m:n,:]与X[:,m:n]的区别

    import numpy as np data_list = [[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]] data_list=np.array(data_list) print (data_list[0:2,:])

    输出

    [[1 2 3] [1 2 3]]

    print (data_list[:,0:1])

    输出

    [[1] [1] [1] [1] [1] [1]]

    Processed: 0.011, SQL: 8