【机器学习实战】学习代码分析(2)

约会网站配对
将文本记录转换为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]
>>> 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值