机器学习实战kNN中的文本转换为数组程序心得

机器学习实战kNN中的文本转换为数组程序心得

  • 原程序
  • 出现的问题
  • 解决的办法

原程序

在机器学习实战书中2.2.1章节中,作者在准备数据时,打算从文本文件中解析数据,其代码为:

def file2matrix(filename)fr = open(filename)
    numberOfLines = len(fr.readlines())
    returnMat = zeros((numberOfLines,3))
    classLabelVector = []
    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
    >>>reload(kNN)
    >>>datingDataMat,datingLabels = kNN.file2matrix('datingTestSet.txt')

在其中文版的书中,datingLabels输出是[3,2,1…],因为在输入文件datingTestSet.txt(可以去网站下载)中,他的标签是largeDoses,smallDoses,didntLike,估计他的本意就是用1,2,3来代替标签largeDoses,smallDoses,didntLike。

出现的问题

但是运行这个程序是有问题的,主要出现在

classLabelVector.append(int(listFromLine[-1]))

本意是将listFromLine最后一列的字符标签转成int类型,但是运行是不行的,会出错。

解决办法

* 按照英文版机器学习实战,输出的就是标签字符,所以,可以改为如下:*

classLabelVector.append(listFromLine[-1])

* 按照中文版机器学习实战,要输出int型数字,可以使用一个字典:*

def file2matrix(filename):
    '''
    :param filename: 输入为文件名字符串
    :return: 输出为训练样本矩阵和类标签向量
    '''
    fr = open(filename)
    arrayOLines = fr.readlines()
    numberOfLines = len(arrayOLines)
    returnMat = zeros((numberOfLines, 3))
    classLabelVector = []
    index = 0
    string2int = {'largeDoses':3, 'smallDoses':2, 'didntLike':1}# 创建一个字典
    for line in arrayOLines:
        line = line.strip()# 截取回车字符
        listFromLine = line.split('\t')# 将整行的数据分割成一个元素列表
        returnMat[index, :] = listFromLine[0:3]
        classLabelVector.append(string2int.get(listFromLine[-1]))# 取字典值所对应的键
        index += 1
    return returnMat, classLabelVector
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值