机器学习(七)-基于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

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值