K近邻算法经典案例实现之海伦约会

本文介绍了如何使用K近邻算法进行约会对象的分类。海伦通过在线约会网站收集数据,包括每年飞行常客里程数、玩视频游戏时间百分比和每周冰淇淋消费量等特征。通过Python解析数据,利用Matplotlib进行数据可视化,然后进行数据归一化,最终测试算法性能以验证分类器的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

  上文实现了简单的K近邻算法,本文来介绍下完整的K近邻算法,将实际需求与算法进行结合,做个小小的demo,毕竟'talk is cheap,show me the code.'。

K近邻算法的一般流程如下:

  1. 收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据。一般来讲,数据放在txt文本文件中,按照一定的格式进行存储,便于解析及处理。
  2. 准备数据:使用Python解析、预处理数据。
  3. 分析数据:可以使用很多方法对数据进行分析,例如使用Matplotlib将数据可视化。
  4. 测试算法:计算错误率。
  5. 使用算法:错误率在可接受范围内,就可以运行k-近邻算法进行分类

案例需求分析

海伦女士一直使用在线约会网站寻找适合自己的约会对象。尽管约会网站会推荐不同的任选,但她并不是喜欢每一个人。经过一番总结,她发现自己交往过的人可以进行如下分类:

  1. 不喜欢的人
  2. 魅力一般的人
  3. 极具魅力的人

海伦收集约会数据已经有了一段时间,她把这些数据存放在文本文件datingTestSet.txt中,每个样本数据占据一行,总共有1000行。datingTestSet.txt数据下载: 数据集下载

海伦收集的样本数据主要包含以下3种特征:

  1. 每年获得的飞行常客里程数

  2. 玩视频游戏所消耗时间百分比

  3. 每周消费的冰淇淋公升数

代码实现

数据解析以及可视化
  因为原始数据往往不方便进行直接计算,因此需要对文件进行简单处理成我们需要的数据。可视化是为了方便直接观察数据的规律。

代码如下:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.lines as mlines

# 数据预处理
def fileRead(fileName):
    #打开文件
    fr = open(fileName)
    #读取全部内容
    arraryOfLines = fr.readlines()
    #求行数
    numberOfLines = len(arraryOfLines)
    #生成numberOfLines行,3列的矩阵,方便后面存放数据
    returnMat = np.zeros((numberOfLines, 3))
    #用于存放类别
    classLabelVector = []
    #设置索引,用于循环
    index = 0
    #开始循环读取
    for line in arraryOfLines:
        #去除掉文件中的多余字符
        line = line.strip()
        #用空格对内容进行分割
        listFormLine = line.split('\t')
        #赋值
        returnMat[index, :] = listFormLine[0:3]
        #对类别数组进行赋值
        if listFormLine[-1] == 'didntLike':
            classLabelVector.append(1)
        if listFormLine[-1] == 'smallDoses':
            classLabelVector.append(2)
        if listFormLine[-1] == 'largeDoses':
            classLabelVector.append(3)
        index += 1
    return returnMat, classLabelVector


# 数据展示
def showData(datingDataMat, datingLabels):

    fig, axs = plt.subplots(nrows=2, ncols=2, sharex=False, sharey=False, figsize=(13, 8))


    LabelsColors = []
    for i in datingLabels:
        if i == 1:
            LabelsColors.append('black')
        if i == 2:
            LabelsColors.append('orange')
        if i == 3:
            LabelsColors.append('red')
    axs[0][0].scatter(x=datingDataMat[:, 0], y=datingDataMat[:, 1], color=LabelsColors, s=15, alpha=.5)
    axs0_title_text = axs[0][0].set_title('flight_play')
    axs0_xlabel_text = axs[0][0].set_xlabel('flight_time')
    axs0_ylabel_text = axs[0][0].set_ylabel('play_time')
    plt.setp(axs0_title_text, size=9, weight='bold', color='red')
    plt.setp(axs0_xlabel_text, size=7, weight='bold', color='black')
    plt.setp(axs0_ylabel_text, size=7, weight='bold', color='black')
    axs[0][1].scatter(x=datingDataMat[:, 0]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值