【其他】《机器学习实战》 2.1 小节 kNN 算法中 invalid literal for int() with base 10:‘largeDoses

[这是我若干年前的博文,准确性和专业程度都无法保证,请谨慎参考]
机器学习实战 一书 2.1 小节 kNN 算法中,出现一列如下形式

def file2matrix(filename):
    fr = open(filename)
    numberOfLines = len(fr.readlines())         #get the number of lines in the file
    returnMat = zeros((numberOfLines,3))        #prepare matrix to return
    classLabelVector = []                       #prepare labels return   
    fr = open(filename)
    index = 0
    for line in fr.readlines():
        line = line.strip()
        listFromLine = line.split('\t')
        returnMat[index,:] = listFromLine[0:3]
        classLabelVector.append(int(listFromLine[-1]))  #  运行到这里会报错
        index += 1
    return returnMat,classLabelVector

错误为:invalid literal for int() with base 10:‘largeDoses’
此处把字符串转换为整型,出现错误。
而对照书中结果为

这里写图片描述

可见,不是单纯的把字符串改为整型数据,而是改成表。所以,修改程序如下,

def file2matrix(filename):  # 从文件中读入训练数据,并存储为矩阵
    fr = open(filename)
    arrayOLines = fr.readlines()
    numberOfLines = len(arrayOLines)        # 获取 n=样本的行数
    returnMat = zeros((numberOfLines,3))    # 创建一个2维矩阵用于存放训练样本数据,一共有n行,每一行存放3个数据
    classLabelVector = []                   # 创建一个1维数组用于存放训练样本标签。
    index = 0
    for line in arrayOLines :
        line = line.strip()  # 把回车符号给去掉
        listFromLine = line.split('\t')  # 把每一行数据用\t分割
        returnMat[index, :] = listFromLine[0:3]  # 把分割好的数据放至数据集,其中index是该样本数据的下标,就是放到第几行
        labels = {'didntLike':1,'smallDoses':2,'largeDoses':3}  # 新增
        classLabelVector.append(labels[listFromLine[-1]])  # 去掉了int
        # 把该样本对应的标签放至标签集,顺序与样本集对应。 python语言中可以使用-1表示列表中的最后一列元素

        index += 1
    return returnMat,classLabelVector

增加一个列表作为对应,可得到书中结果
labels = {‘didntLike’:1,‘smallDoses’:2,‘largeDoses’:3} # 新增
classLabelVector.append(labels[listFromLine[-1]]) # 改成labels[]
即可。
再次运行,结果如下:
这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MengWoods

感谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值