完整代码及数据地址:https://github.com/cqulun123/Machine-Learning-in-Action
0 问题背景介绍
我的朋友海伦一直使用在线约会网站寻找适合自己的约会对象。尽管约会网站会推荐不同的人选,但她并不是喜欢每一个人。经过一番总结,她发现曾交往过三种类型的人:
不喜欢的人
魅力一般的人
极具魅力的人
尽管发现了上述规律,但海伦依然无法将约会网站推荐的匹配对象归入恰当的分类。她觉得可以在周一到周五约会那些魅力一般的人,而周末则更喜欢与那些极具魅力的人为伴。海伦希望我们的分类软件可以更好地帮助她将匹配对象划分到确切的分类中。此外海伦还收集了一些约会网站未曾记录的数据信息,她认为这些数据更有助于匹配对象的归类 。
1 在约会网站上使用k-近邻算法的步骤
(1) 收集数据:提供文本文件。(2) 准备数据:使用Python解析文本文件。
(3) 分析数据:使用Matplotlib画二维扩散图。
(4) 训练算法:此步骤不适用于k-近邻算法。
(5) 测试算法:使用海伦提供的部分数据作为测试样本。测试样本和非测试样本的区别在于:测试样本是已经完成分类的数据,如果预测分类与实际类别不同,则标记为一个错误。
(6) 使用算法:产生简单的命令行程序,然后海伦可以输入一些特征数据以判断对方是否为自己喜欢的类型。
2 准备数据:从文本文件中解析数据
海伦收集约会数据已经有了一段时间,她把这些数据存放在文本文件 datingTestSet2.txt中,每个样本数据占据一行,总共有1000行。海伦的样本主要包含以下3种特征: 每年获得的飞行常客里程数
玩视频游戏所耗时间百分比
每周消费的冰淇淋公升数
在将上述特征数据输入到分类器之前,必须将待处理数据的格式改变为分类器可以接受的格式。 代码如下:
def file_to_matrix(filename):
"""
函数作用:从文件中读入训练数据,并存储为矩阵
:param filename:文件名字符串
:return:训练样本矩阵和类标签向量
"""
# 打开文件
fr = open(filename)
# 读取文件内容
array_lines = fr.readlines()
# 得到文件行数
number_of_lines = len(array_lines)
# 返回解析后的数据
return_mat = np.zeros((number_of_lines, 3))
# 定义类标签向量
class_label_vector = []
# 行索引值
index = 0
for line in array_lines:
# 去掉 回车符号
line = line.strip()
# 用\t分割每行数据
list_from_line = line.split('\t')
# 选取前3个元素,将它们存储到特征矩阵中
return_mat[index, :] = list_from_line[0:3]
# 把该样本对应的标签放至标签向量,顺序与样本集对应。
class_label_vector.append(int(list_from_line[-1]))
index += 1
return return_mat, class_label_vector
3 分析数据:使用 Matplotlib 创建散点图
首先我们使用Matplotlib制作原始数据的散点图 ,代码如下:
if __name__ =