约会网站配对
将文本记录转换为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 base 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 base 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 base 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]
>>>