基于KNN分类的约会网站配对改进算法
1 项目介绍
某APP用户一直使用在线约会软件寻找适合自己的约会对象。尽管约会网站会推荐不同的人选,但她并不是喜欢每一个人。经过一番总结,她发现曾交往过三种类型的人:
- 不喜欢的人(3)
- 魅力一般的人(2)
- 极具魅力的人(1)
某APP用户希望分类软件可以更好地帮助她将匹配对象划分到确切的分类中。此外还可以收集了约会软件未曾记录的数据信息,她认为这些数据更有助于匹配对象的归类。收集的部分信息如下图所示:
数据集下载
样本主要包含以下3种特征:
- 每年获得的飞行常客里程数
- 玩视频游戏所耗时间百分比
- 每周消费的冰淇淋公升数
2 准备数据:从文本文件中解析数据
在将上述特征数据输入到分类器之前,必须将待处理数据的格式改变为分类器可以接受的格式。
import numpy as np
def file2matrix(filename):
"""
:param filename: APP用户收集的约会数据的文件名
:return:
returnMat: 用户提供的每行数据信息,三列,
分别是每年获得的飞行常客里程数,
玩视频游戏所耗时间百分比,
每周消费的冰淇淋公升数
classLabelVetor:
用户的评价信息, 一般分为3类(1,2,3)
"""
fr = open(filename)
arrayOfLines = fr.readlines()
# print(arrayOfLines)
# 获得文件行数;
numerOfLines = len(arrayOfLines)
# 创建要返回的Numpy矩阵;
returnMat = np.zeros((numerOfLines, 3))
# 解析文件数据到矩阵中;
classLabelVetor = []
index = 0
for line in arrayOfLines:
line = line.strip()
listFromLine = line.split('\t')
returnMat[index, :] = listFromLine[0:3]
classLabelVetor.append(listFromLine[-1])
index += 1
return returnMat, classLabelVetor
print(file2matrix('data/datingTestSet2'))
返回的值显示:
3 分析数据:使用 Matplotlib 创建散点图
使用Matplotlib库图形化清晰地标识了三个不同的样本分类区域,具有不同爱好的人其类别区域也不同。
def draw_pic(datingDataMat, datingLabels):
"""
每年获取的飞行常客里程数与每周所消费的冰淇淋公升数”构成的散点图。
:param datingDataMat:
:param datingLabels:
:return:
"""
# 中文显示乱码问题;
myfont = font_manager.FontProperties(fname="/usr/share/fonts/cjkuni-uming/uming.ttc", size=12)
# 创建画布
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(datingDataMat[:, 0], datingDataMat[:, 2],
15 * datingLabels, datingLabels)
plt.xlabel("每年的飞行里程数", fontproperties=myfont)
plt.ylabel("每周消费的冰淇淋公升数", fontproperties=myfont)
plt.grid(alpha=0.5)
plt.show()
- 效果展示
4 准备数据:归一化数值
-
计算样本3和样本4之间的距离:
-
问题:
飞行常客里程数对于计算结果的影响将远远大于其他两个特征的影响 -
解决方式:
处理不同取值范围的特征值时,通常采用的方法是将数值归一化,如将取值范围处理为0到1或者-1到1之间。 -
归一化公式: newValue = oldValue / max