一 背景
在学习了上一节简单的k-近邻算法实现后,这一篇文章讲一下书中给出的一个例子,在约会网站上使用k-近邻算法:
1)收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据。一般来讲,数据放在txt文本文件中,按照一定的格式进行存储,便于解析及处理。
2)准备数据:使用Python解析、预处理数据。
3)分析数据:可以使用很多方法对数据进行分析,例如使用Matplotlib将数据可视化。
4)测试算法:计算错误率。
5)使用算法:错误率在可接受范围内,就可以运行k-近邻算法进行分类。
二 准备数据:从文本文件中解析数据
直接用了一个博主给的数据:
datingTestSet.txt数据下载
海伦收集的样本数据主要包含以下3种特征:
- 每年获得的飞行常客里程数
- 玩视频游戏所消耗时间百分比
- 每周消费的冰淇淋公升数
在第一节代码基础上创建名为file2matrix的函数:
def file2matrix(filename):
fr = open(filename)
# 读取文件所有内容
arrayOLines = fr.readlines()
# 得到文件行数
numberOfLines = len(arrayOLines)
# 返回的NumPy矩阵,解析完成的数据:numberOfLines行,3列
returnMat = zeros((numberOfLines, 3))
classLabelVector = []
# 行的索引值
index = 0
for line in arrayOLines:
# s.strip(rm),当rm空时,默认删除空白符
line = line.strip()
# 使用s.split(str="",num=string,cout(str))将字符串根据'\t',tab字符分隔符进行切片。
listFromLine = line.split('\t')
# 将数据前三列提取出来,存放到returnMat的NumPy矩阵中,也就是特征矩阵
returnMat[index, :] = listFromLine[0:3]
# 根据文本中标记的喜欢的程度进行分类,1代表不喜欢,2代表魅力一般,3代表极具魅力
if listFromLine[-1] == 'didntLike':
classLabelVector.append(1)
elif listFromLine[-1] == 'smallDoses':
classLabelVector.append(2)
elif listFromLine[-1] == 'largeDoses':
classLabelVector.append(3)
index += 1
return returnMat, classLabelVector
上面代码主要作用是从txt文件中一行一行的提取出数据到数组中,首先用line.strip()截取掉所有的回车字符,然后使用tab字符“\t”将上一步得到的整行数据分割成一个元素列表。
然后测试:
if __name__ == '__main__':
#打开的文件名
filename = "datingTestSet.txt"
#打开并处理数据
datingDataMat, datingLabels = file2matrix(filename)
print(datingDataMat)
print(datingLabels)
数据解析结果类似:
三 使用Matplotlib让数据可视化
这里书上给的代码不多,参考了一