[这是我若干年前的博文,准确性和专业程度都无法保证,请谨慎参考]
机器学习实战 一书 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[]
即可。
再次运行,结果如下: