约会网站配对
将文本记录转换为Numpy

def file2matrix(filename):
  fr=open(filename)
  arrayOLines=fr.readlines()
  #读取所有行直到EOF
  numberOfLines= len(arrayOLines)
  #知道有多少行
  returnMat=zeros((numberOfLines,3))
  #array=([[0.,0.,0.],[0.,0.,0.],...])
  classLabelVector=[]
  index=0
  for line in arrayOLines:
    line=line.strip()
    #移除每行回车
    listFromLine=line.split(\'\\t\')
    #遇到空格就切分,把一句话的每个单词切出来
    returnMat[index,:]=listFromLine[0:3]
    #取每行的元素的前3位组建成一个新的矩阵
    classLabelVector.append(int(listFromLine[-1]))
    #将文本的每行的最后一列元素加到classLabeVector中
    #!!!注意字符串是转不了int型的,所以一定要把字符串自定义成int再去操作!!!
    index+=1
    #调取下一行
  return returnMat,classLabelVector

这个例子虽然不能运行KNN算法,但是交了一种将文本转换为可执行数据的方法。
其中比较重要是classLabelVector.append(int(listFromLine[-1]))这条语句,因为很明显经过之前C语言的学习会有一种可以强制string转换int的概念,但是在操作这个语句的时候我也进行了一些测试如验证python里是否也可如此简单的强制转换:

>>> a=[\'apple\',\'banana\',\'orange\']
>>> a[-1]
\'orange\'
>>> int(a[-1])

Traceback (most recent call last):
  File \"<pyshell#77>\", line 1, in <module>
    int(a[-1])
ValueError: invalid literal for int() with   10: \'orange\'
>>> b=[]
>>> b.append(int(a[-1]))

Traceback (most recent call last):
  File \"<pyshell#79>\", line 1, in <module>
    b.append(int(a[-1]))
ValueError: invalid literal for int() with   10: \'orange\'

很明显可以看出来这种方法是不可以之间转换类型的,所以这本书这里的语法是不适用他的第一个TXT。
在执行的时候也会报错:

>>> datingDataMat,datingLabels=kNN.file2matrix(\'datingTestSet.txt\')

Traceback (most recent call last):
  File \"<pyshell#91>\", line 1, in <module>
    datingDataMat,datingLabels=kNN.file2matrix(\'datingTestSet.txt\')
  File \"C:\\Users\\zzx\\Desktop\\机器学习代码测试\\kNN.py\", line 60, in file2matrix
    classLabelVector.append(int(listFromLine[-1]))
ValueError: invalid literal for int() with   10: \'largeDoses\'

庆幸的咱们CSDN的大神们早就发现了这个错误,改正方法是用提供的第二个TXT。
出现正确的结果:

>>> datingDataMat,datingLabels=kNN.file2matrix(\'datingTestSet2.txt\')
>>> datingDataMat
array([[4.0920000e+04, 8.3269760e+00, 9.5395200e-01],
       [1.4488000e+04, 7.1534690e+00, 1.6739040e+00],
       [2.6052000e+04, 1.4418710e+00, 8.0512400e-01],
       ...,
       [2.6575000e+04, 1.0650102e+01, 8.6662700e-01],
       [4.8111000e+04, 9.1345280e+00, 7.2804500e-01],
       [4.3757000e+04, 7.8826010e+00, 1.3324460e+00]])
>>> datingLabels[0:20]
[3, 2, 1, 1, 1, 1, 3, 3, 1, 3, 1, 1, 2, 1, 1, 1, 1, 1, 2, 3]
>>> 
收藏 打印