1. 情境导入:
我的朋友海伦一直使用在线约会网站寻找适合自己的约会对象。尽管约会网站会推荐不同的人选,但她并不是喜欢每一个人。经过一番总结,她发现曾交往过三种类型的人:
- 不喜欢的人
- 魅力一般的人
- 极具魅力的人
尽管发现了上述规律,但海伦依然无法将约会网站推荐的匹配对象归入恰当的类别。她觉得可以在周一到周五约会那些魅力一般的人,而周末则更喜欢与那些极具魅力的人为伴。海伦希望我们的分类软件可以更好地帮助她将匹配对象划分到确切的分类中。
海伦收集约会数据已经有了一段时间,她把这些数据存放在文本文件datingTestSet2.txt中,每个样本数据占据一行,总共有1000行。海伦的样本主要包含以下3种特征:
- 每年获得的飞行常客里程数
- 玩视频游戏所耗时间百分比
- 每周消费的冰淇淋公升数
2. 准备数据:从文本文件中解析数据
在将上述特征数据输入到分类器之前,必须将待处理数据的格式改变为分类器可以接受的格式。 创建名为file2matrix的函数,以此来处理输入格式问题。该函数的输入为文件名字符串,输出为训练样本矩阵和类标签向量。
def file2matrix(filename):
fr = open(filename)
arrayolines = fr.readlines() # 得到文件的行数
numberoflines = len(arrayolines)
returnmat = np.zeros((numberoflines,3))
# 创建以0填充的NumPy矩阵,为了简化处理,将另一维度设置为3
classlabelvector = []
index = 0
for line in arrayolines:
line = line.strip() # 截取掉所有的回车字符
listfromline = line.split('\t') # 将上一步得到的整行数据分割成一个元素列表
returnmat[index, :] = listfromline[0 : 3] # 选取前三个元素
labels = {'didntLike':1,'smallDoses':2,'largeDoses':3}
classlabelvector.append(labels[listfromline[-1]]) # -1表示列表的最后一列元素
index += 1
return returnmat, classlabelvector
使用函数file2matrix读取文件数据后,可以简单检查一下数据内容:
datingdatamat, datinglabels = file2matrix('datingTestSet2.txt')
print("datingdatamat:", datingdatamat)
print("datinglabels:", datinglabels[0 : 20])
dati