前言

这是一个KNN算法的应用实例,参考《机器学习实战》中的datingTestSet2.txt的数据集。
可以通过对不同约会对象的特征进行分析然后自动得出以下三种结论:
  • 不喜欢的
  • 有点魅力的
  • 很有魅力的

准备数据

这个数据集中针对每一个约会对象收集了三种具有代表性的特征,分别是:
  • 每年获得的飞行常客里程数
  • 玩网游所消耗的时间比
  • 每年消耗的冰淇淋公升数
然后对每个约会对象的三种结论进行打分,对应的分数分别为1、2、3。

数据展示:



这样的数据需要处理成分类器可以接受的格式,所以我们创建了file2matrix函数用与完成这个功能。
代码如下 :

  1. # ==========================
  2. # 读入文本记录,转换为NumPy,便于其他函数使用
  3. # 输入:文本记录的路径
  4. # ==========================
  5. def file2matrix(filename):
  6. fr = open(filename)
  7. arrayOLines = fr.readlines()
  8. numberOfLines = len(arrayOLines)
  9. returnMat = zeros((numberOfLines, 3))
  10. classLabelVector = []
  11. index = 0
  12. for line in arrayOLines:
  13. line = line.strip() # 删除字符串首尾的空白符(包括'\n', '\r', '\t', ' ')
  14. listFromLines = line.split("\t")
  15. returnMat[index, :] = listFromLines[0:3]
  16. classLabelVector.append(int(listFromLines[-1]))
  17. index += 1
  18. return returnMat, classLabelVector
可视化分析数据:
我们用matplotlib制作原始数据的散点图,用于分析并找出三个特征中的哪两个特征可以得到更好的分类效果。
绘图代码:
  1. def plotSca(datingDataMat, datingLabels):
  2. import matplotlib.pyplot as plt
  3. fig = plt.figure()
  4. ax1 = fig.add_subplot(121)
  5. # 玩网游所消耗的时间比(横轴)与每年消耗的冰淇淋公升数(纵轴)的散点图
  6. ax1.scatter(datingDataMat[:,1], datingDataMat[:, 2], 15.0*array(datingLabels), 5.0*array(datingLabels))
  7. ax2 = fig.add_subplot(122)
  8. # 每年获得的飞行常客里程数(横轴)与 玩网游所消耗的时间比(纵轴)的散点图
  9. ax2.scatter(datingDataMat[:,0], datingDataMat[:, 1], 15.0*array(datingLabels), 5.0*array(datingLabels))
  10. plt.show()
绘图效果:
从图中可以看出,显然图二中展示的两个特征更容易区分数据点从属的类别。

归一化数值:
从展示数据中我们可以很明显的看出,不同特征值量级相差太大。
而他们在模型中占的权重又并不比其他特征大,这个时候就需要对特征值进行归一化,
也就是将取值范围处理为0到1或者-1到1之间
这里用autoNorm()函数实现这个功能

  1. # =====================================
  2. # 如果不同特征值量级相差太大,
  3. # 而他们在模型中占的权重又并不比其他特征大,
  4. # 这个时候就需要对特征值进行归一化,
  5. # 也就是将取值范围处理为0到1或者-1到1之间
  6. # 本函数就是对数据集归一化特征值
  7. # dataset: 输入数据集
  8. # =====================================
  9. def autoNorm(dataset):
  10. minVals = dataset.min(0)
  11. maxVals = dataset.max(0)
  12. ranges = maxVals - minVals
  13. normDataset = zeros(shape(dataset))
  14. m = dataset.shape[0]
  15. normDataset = dataset - tile(minVals, (m, 1))
  16. normDataset = normDataset/tile(ranges, (m, 1)) # 矩阵中对应数值相除
  17. return normDataset, ranges, minVals
测试算法:
通过上面的准备工作,再加上上一节的classify0分类函数就可以构成一个完整的分类器,用于对约会对象快速分类打分。
测试的时候一个很重要的工作就是评估算法的正确率。
通常我们会把整个数据集按9:1的比例分成训练集和测试集。
测试集就是用来检测分类器的正确率。
需要注意的是,在选择测试集的时候需要保持数据的随机性。
测试分类代码如下:

  1. '''
  2. 分类器针对约会网站的测试代码
  3. '''
  4. def datingClassTest():
  5. hoRatio = 0.10 # 数据集中用于测试的比例
  6. filePath = "E:\ml\machinelearninginaction\Ch02\datingTestSet2.txt"
  7. datingDataMat, datingLabels = file2matrix(filePath)
  8. # plotSca(datingDataMat, datingLabels)
  9. normMat, ranges, minVals = autoNorm(datingDataMat)
  10. m = normMat.shape[0]
  11. numTestVecs = int(hoRatio*m)
  12. errcounter = 0.0
  13. for i in range(numTestVecs):
  14. classifierResult = classify0(normMat[i, :],
  15. normMat[numTestVecs:m, :],
  16. datingLabels[numTestVecs:m], 3)
  17. print "the classifier came back with: %d, the real answer is: %d" % \
  18. (classifierResult, datingLabels[i])
  19. if (classifierResult !=datingLabels[i]): errcounter +=1.0
  20. print "the total error rate is: %f" % (errcounter/float(numTestVecs))
  21. print errcounter

输出效果如图所示:
输出表示错误率为5%,且显示了算法的运行时间(通过import time,然后用time.clock - time.start实现)

小结

从运行效果看,算法的优点是精度高。而且算法对异常值不敏感,不需要事先训练。
但是从算法步骤上看,在对每一个新数据进行分类的时候都要和训练集中的每一个已知数据进行比较和相似度计算
可以预见的是,一旦数据集很大的时候,算法所要求的时间复杂度和空间复杂度就会迅速提高



【2】KNN:约会对象分类器的更多相关文章

  1. 第二篇:基于K-近邻分类算法的约会对象智能匹配系统

    前言 假如你想到某个在线约会网站寻找约会对象,那么你很可能将该约会网站的所有用户归为三类: 1. 不喜欢的 2. 有点魅力的 3. 很有魅力的 你如何决定某个用户属于上述的哪一类呢?想必你会分析用户的 ...

  2. 机器学习实战笔记——KNN约会网站

    ''' 机器学习实战——KNN约会网站优化 ''' import operator import numpy as np from numpy import * from matplotlib.fon ...

  3. kNN算法实例(约会对象喜好预测和手写识别)

    import numpy as np import operator import random import os def file2matrix(filePath):#从文本中提取特征矩阵和标签 ...

  4. 第二节课-Data-driven approach:KNN和线性分类器分类图片

    2017-08-12 1.图片分类是很多CV任务的基础: 2.图片分类要面临很多的问题,比如图片被遮挡,同一种动物有很多种颜色,形状等等,算法需要足够强壮: 3.所以很难直接写出程序来进行图片分类,常 ...

  5. kNN#约会网站预测数据

    #约会网站预测数据 def classifyPersion(): resultList = ['not at all','in small doses','in large doses'] #inpu ...

  6. k-近邻(KNN)算法改进约会网站的配对效果[Python]

    使用Python实现k-近邻算法的一般流程为: 1.收集数据:提供文本文件 2.准备数据:使用Python解析文本文件,预处理 3.分析数据:可视化处理 4.训练算法:此步骤不适用与k——近邻算法 5 ...

  7. 海伦去约会——kNN算法

    下午于屋中闲居,于是翻开<机器学习实战>一书看了看“k-邻近算法”的内容,并学习了一位很厉害的博主Jack Cui的代码,自己照着码了一遍.在此感谢博主Jack Cui的知识分享. 一.k ...

  8. kNN分类算法实例1:用kNN改进约会网站的配对效果

    目录 实战内容 用sklearn自带库实现kNN算法分类 将内含非数值型的txt文件转化为csv文件 用sns.lmplot绘图反映几个特征之间的关系 参考资料 @ 实战内容 海伦女士一直使用在线约会 ...

  9. KNN算法项目实战——改进约会网站的配对效果

    KNN项目实战——改进约会网站的配对效果 1.项目背景: 海伦女士一直使用在线约会网站寻找适合自己的约会对象.尽管约会网站会推荐不同的人选,但她并不是喜欢每一个人.经过一番总结,她发现自己交往过的人可 ...

随机推荐

  1. feign传输String json串 自动转义 \ 解决方法

    @RequestMapping(value={"/sysOrgRest/getInfoByOrgIds"}, method={org.springframework.web.bin ...

  2. 2.PHP利用PDO连接方式连接mysql数据库

    代码如下 <?php$serverName = "这里填IP地址";$dbName = "这里填数据库名";$userName = "这里填用户 ...

  3. linux CPU100%异常排查

    1.top查找出占CPU比例最高的进程(5881): 2.查看该进程正在执行的线程: top -H -p  5881 3.将线程转换成16进制 printf ‘%x\n’ 5950 4.查看异常线程执 ...

  4. FutrueTask原理及源码分析

    1.前言 相信很多人了解到FutureTask是因为ThreadPoolExecutor.submit方法,根据ThreadPoolExecutor.submit的使用,我们可以先猜一下FutureT ...

  5. sleep(),yield(),join(),wait()

    sleep(),yield(),join(),wait() sleep() sleep是Thread类的静态方法,在指定的时间内让当前线程暂停执行,但不会释放锁标志 也就是使线程进入阻塞状态 wait ...

  6. 建立第一个G2图表

    Step1:引进G2脚本 方法一:引入在线脚本 <script src="https://gw.alipayobjects.com/os/lib/antv/g2/3.4.10/dist ...

  7. intellIJ IDEA学习笔记2

    常用的有fori/sout/psvm+Tab即可生成循环.System.out.main方法等boilerplate样板代码 例如要输入for(User user : users)只需输入user.f ...

  8. vscode中配置git

    vscode中配置git vscode 报错 未找到Git.请安装Git,或在"git.path" 设置中配置 第一步安装git git安装方法自行解决,提供git下载连接! gi ...

  9. ArcGIS数据格式详解

  10. 解决问题:安装Ubuntu时遇到nouveau sched_error问题

    当我们在为有独立显卡gpu的电脑安装Ubuntu系统时,有可能会遇到nouveau sched_error问题. 方法一:安装系统时,开机出现dell图标时长按F12进入启动项选择界面, 然后选择UE ...