KNN算法实战-改进约会网站配对效果

kNN实战之改进约会网站配对效果

引言

简单的说,KNN算法采用测量不同特征值之间的距离方法进行分类。工作原理:存在一个样本数据集,即训练数据集,并且样本集中每个样本数据都存在标签,即我们知道样本数据集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,只选择样本数据集中前K个最相似的数据,这就是KNN算法中的k的出处,通常K是大于20的整数。最后,选择k个最相似的数据中出现次数最多的分类作为新数据的分类。

优点:精度高,对异常值不敏感,无数据输入假定

缺点:计算复杂度高,空间复杂度高

适用范围:数值型和标称型

今天我们将使用KNN算法改进约会网站的配对效果,首先先介绍一下该实战的背景。

背景介绍

美女二丫在在线约会网站寻找适合自己的约会对象时,尽管约会网站会推荐不同的人选,但她并不是喜欢每一个人。经过一番总结,她发现曾经交往过三种类型的人:

不喜欢的人

魅力一般的人

极具魅力的人

尽管发现上述的规律,但二丫依然不能将约会网站推荐匹配的对象归入恰当的分类。她可以在周一到周五月那些魅力一般的人,在周六周天约那些极具魅力的人。为此希望我们帮她设计一个可以将不同对象归入恰当的分类,为此,二丫还收提供了一些必要的信息。

算法流程

收集数据:提供文本文件

准备数据:使用python解析文本文件

分析数据:使用matplotlib画二维图

训练数据:

测试算法:使用二丫提供的部分数据作为测试集

部署算法:产生简单的命令行程序,然后二丫可以输入一些特征数据以判断对方是否为自己喜欢的类型。

1. 准备数据:从文本文件中解析数据

数据保存在datingTestSet.txt中,每个样本数据占据一行,总共1000行,样本主要包含以下三个特征:

每年获得的飞行里程

玩游戏所消耗的时间百分比

每周消耗的冰激凌公斤数

将文本记录转换为Numpy的解析程序:

def file2matrix(filename): fr = open(filename) numberOfLines = len(fr.readlines()) #get the number of lines in the file returnMat = zeros((numberOfLines,3)) #prepare matrix to return classLabelVector = [] #prepare labels return fr = open(filename) index = 0 for line in fr.readlines(): line = line.strip() listFromLine = line.split('\t') returnMat[index,:] = listFromLine[0:3] classLabelVector.append(int(listFromLine[-1])) index += 1 return returnMat,classLabelVector

该函数作为kNN函数的子函数存放在kNN.py文件中,在python命令行输入一下命令:

>>> import sys >>> sys.path.append('C:\Users\NEU\Desktop\JKXY\machinelearninginaction\Ch02') >>> import os >>> os.getcwd() 'C:\\Python26\\Lib\\idlelib' >>> os.chdir('C:\Users\NEU\Desktop\JKXY\machinelearninginaction\Ch02') >>> os.getcwd() 'C:\\Users\\NEU\\Desktop\\JKXY\\machinelearninginaction\\Ch02' >>> import kNN >>> datingDataMat, datintLabels = kNN.file2matrix("datingTestSet2.txt")

现在已经将文本文件导入到运行空间,并转化成所需要的格式了,接下来需要了解数据的具体含义。所以使用python工具来图像化展示数据内容,以辨识出一些数据模式。

2. 分析数据:使用matplotlib创建算点图

首先使用matplotlib制作原始数据的散点图,在python命令行中输入一下命令:

>>> import matplotlib >>> import matplotlib.pyplot as plt >>> fig = plt.figure() >>> ax = fig.add_subplot(111) >>> ax.scatter(datingDataMat[:,1], datingDataMat[:,2]) <matplotlib.collections.CircleCollection object at 0x03C8A190> >>> plt.show()

没有类别标签的约会数据散点图,难以辨识图中的点属于哪一类(“玩游戏所占时间百分比”和“每周消耗的冰激凌公斤数”)

datingDataMat的第二列和第三列分别表示特征值的“玩游戏所占时间百分比”和“每周消耗的冰激凌公斤数”,第一列为“每年的飞行里程数”。由于没有使用样本分类的特征值,上图我们不能得到任何有用的数据模式信息。

在python命令行重新输入以下命令:

带有分类标签的约会数据散点图,虽然能够比较容易的区分数据点属于哪一类,但依然难以根据这张表得出结论性的信息(“玩游戏所占时间百分比”和“每周消耗的冰激凌公斤数”)

kNN改进约网站配对效果应用分两篇文章描述,本篇博文就到这儿。下一篇文章讲解算法的归一化以及knn的关键部分(python实现的代码在下一篇文章中一次性给出)。

原文发布于微信公众号 - 机器学习算法与Python学习(guodongwei1991)

原文发表时间:2016-12-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏信数据得永生

《Scikit-Learn与TensorFlow机器学习实用指南》第2章 一个完整的机器学习项目

1.1K20
来自专栏CDA数据分析师

AI可能真的要代替插画师了……

事先声明,这篇文章的标题绝不是在耸人听闻。事情的起因是今天早上在朋友圈看到同学在转发一篇论文,名字叫《Create Anime Characters with ...

25310
来自专栏ACM小冰成长之路

51Nod-1208-Stars in Your Window

ACM模版 描述 ? 题解 线段树 + 扫描线。 把星星转化为矩形,把矩形转化成线段,然后求哪一条线段权值最大。具体的思路可以看看 光速小子0511’s blo...

2066
来自专栏人人都是极客

教程 | 基于计算机视觉使用Python和OpenCV计算道路交通

本文介绍了不使用复杂的深度学习算法计算道路交通的方法。该方法基于计算机视觉,仅使用 Python 和 OpenCV,在背景提取算法的帮助下,使用简单的移动侦测来...

5856
来自专栏BestSDK

13个Tensorflow实践案例,深度学习没有想象中那么难

关于深度学习,每个人都有自己的看法。有人说就是炼丹,得个准确率召回率什么的,拿到实际中,问问为什么,都答不上来。各种连代码都没写过的人,也纷纷表示这东西就是小孩...

50310
来自专栏编程

基于micropython的数字滤波器

刚参加了昨天的硕士研究生考试,专业课考的信号与系统,报考学校今年出题出的有点偏,不是题型偏而是考察知识点有明显的偏重,简单说考纲里所罗列的考点最多只考了百分之三...

2856
来自专栏ATYUN订阅号

使用Google的Quickdraw创建MNIST样式数据集!

对于那些运行深度学习模型的人来说,MNIST是无处不在的。手写数字的数据集有许多用途,从基准测试的算法(在数千篇论文中引用)到可视化,比拿破仑的1812年进军更...

4328
来自专栏机器之心

入门 | 完全云端运行:使用谷歌CoLaboratory训练神经网络

3749
来自专栏磐创AI技术团队的专栏

数据可视化详解+代码演练

1684
来自专栏新智元

旧照片着色修复神器!自注意力GAN效果惊艳

图像着色、图像增强、恢复旧图像等是计算机视觉领域的热点问题,不过,用一个模型很好地实现多个任务的研究不多。

951

扫码关注云+社区

领取腾讯云代金券