海伦约会数据预测

  • 介绍
  • 案例介绍
  • 案例步骤
  • 代码部分
    • 包模块
    • 距离计算函数
    • 数据准备
    • 分析数据
    • 数据归一化处理
    • 测试分类器
  • 总结

介绍

上一篇我们已经初步接触到了K-近邻算法,这次我们用一个案例来进一步加深我们对算法的理解以及数据准备过程中,明白数据处理的重要性。

案例介绍

我的朋友海伦一直使用在线约会网站寻找适合自己的约会对象。尽管约会网站会推荐不同的
人选,但她没有从中找到喜欢的人。经过一番总结,她发现曾交往过三种类型的人:
·不喜欢的人
·魅力一般的人
·极具魅力的人

尽管发现了上述规律,但海伦依然无法将约会网站推荐的匹配对象归人恰当的分类。她觉得可以在周一到周五约会那些魅力一般的人,而周末则更喜欢与那些极具魅力的人为伴。海伦希望我们的分类软件可以更好地帮助她将匹配对象划分到确切的分类中。此外海伦还收集了一些约会网站未曾记录的数据信息,她认为这些数据更有助于匹配对象的归类。
海伦收集约会数据巳经有了一段时间,她把这些数据存放在datingTestSet.txt。

没有数据集的小伙伴访问下面网站,点击右侧的“随书下载”进行下载
http://www.ituring.com.cn/book/1021

海伦的样本主要包含以下3种特征:
每年获得的飞行常客里程数
玩视频游戏所耗时间百分比
每周消费的冰淇淋公升数

案例步骤

(1)收集数据:提供文本文件。
(2)准备数据: 使用python解析文本文件。
(3)分析数据:使用matplotlib画二维扩散图。
(4)训练算法:此步驟不适用于k-近邻算法。
(5)测试算法:使用海伦提供的部分数据作为测试样本。
测试样本和非测试样本的区别在于:测试样本是已经完成分类的数据,如果预测分类与实际类别不同,则标记为一个错误。
(6)使用算法:产生简单的命令行程序,然后海伦可以输入一些特征数据以判断对方是否 为自己喜欢的类型。

代码部分

包模块

import operator
from numpy import *
from os import listdir
import matplotlib
import matplotlib.pylab as plt

距离计算函数

该部分函数已经在上一篇文章提到了过了

# 计算函数
def classify0(inX, dataSet, labels, k):dataSetSize = dataSet.shape[0]diffMat = tile(inX, (dataSetSize,1)) - dataSetsqDiffMat = diffMat**2sqDistances = sqDiffMat.sum(axis=1)distances = sqDistances**0.5sortedDistIndicies = distances.argsort()classCount={}for i in range(k):voteIlabel = labels[sortedDistIndicies[i]]classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)return sortedClassCount[0][0]

数据准备

在将特征数据输人到分类器之前,必须将待处理数据的格式改变为分类器可以接受的格式。
创建名为file2matrix的函数,以此来处理输人格式问题。
该函数的输人为文件名字符串,输出为训练样本矩阵和类标签向量。

# 1.将文本记录转换到numpy的解析程序
def file2matrix(filename):# python 自带的open函数  打开我们要解析的数据集fr = open(filename)     # <_io.TextIOWrapper name='datingTestSet.txt' mode='r' encoding='cp936'>numberOfLines = len(fr.readlines())         # 得到文件行数# ['40920\t8.326976\t0.953952\tlargeDoses\n', '14488\t7.153469\t1.673904\tsmallDoses\n',.......]# 该数据集有 三个特征值 一个目标向量returnMat = zeros((numberOfLines, 3))        # numpy.zeros():创建一个和文件同行数 3列的矩阵(元素为0)#         >>> np.zeros((2, 1))#         array([[ 0.],#                [ 0.]])classLabelVector = []index = 0fr = open(filename)         # 这里要注意 我们再一次打开了文件# 原因是文件再打开后被使用了一次后自动关闭了 导致我们后面继续读取文件时 读取不到信息 就无法正常操作了for line in fr.readlines():                 # 解析文件数据到列表line = line.strip()                     # strip():移除字符串头尾指定的字符序列 无参数为空格和回车字符# str = "123abcrunoob321"# print (str.strip( '12' ))  # 字符序列为 12# 首尾的12 都被移除了   顺序不重要listFromLine = line.split('\t')     # split 切分数据 返回值 列表print("\t分割后的列表:", listFromLine)    # 分割后的列表: ['40920', '8.326976', '0.953952', 'largeDoses']returnMat[index, :] = listFromLine[0:3]     # 提取前三个特征值赋值给矩阵print("第", index, "行得到的列表", returnMat[index, :])    # 第 0 行得到的列表 [4.092000e+04 8.326976e+00 9.539520e-01]classLabelVector.append(listFromLine[-1])  # 提取位于尾末的目标向量(标签信息)index += 1return returnMat, classLabelVector

分析数据

# 2.分析数据 散点图函数封装
# 根据画出的散点图 我们可以自己直观看到 喜欢程度的分布
def printData(data):# 我们用散点图 直观显示 特征值的数据分布  三个特征 我们可以画三个子图 这里我们就用一个作案例了# 用matplotlib创建大图fig  设置字体 黑体plt.rcParams['font.sans-serif'] = ['Simhei']fig = plt.figure()# 定义ax为大图中的子图     111:一行一列第一个ax = fig.add_subplot(111)# 画ax子图 坐标轴为特征值列表 索引为1和2的特征plt.scatter(data[:, 1], data[:, 2])plt.xlabel("玩游戏所占时间")plt.ylabel("每周消费冰激凌数")plt.show()

数据归一化处理


在数据集当中我们发现乘坐飞机里程数数据远大于其他两个特征值
在计算距离的过程中 该数据的计算结果严重影响到了其他两个特征值的权重
为了使三特征值的权重平等 所以我们必须要进行处理
在处理这种不同取值范围的特征值时,我们通常采用的方法是将数值归一化,如将取值范围 处理为0到1或者-1到1之间。
下面的公式可以将任意取值范围的特征值转化为0到1区间内的值:
newValue = {oldValue-min)/ (max-min)

其中max和min分别是数据集中的最小特征值和最大特征值。
虽然改变数值取值范围增加了分类器的复杂度,但为了得到准确结果,我们必须这样做。

# 3.数据归一化处理
def autoNormal(dataSet):minVals = dataSet.min(0)    # 参数0 按列查找最小值  这样可以找出三个特征值的最小值了maxVals = dataSet.max(0)ranges = maxVals - minValsnormDataSet = zeros(shape(dataSet))m = dataSet.shape[0]normDataSet = dataSet - tile(minVals, (m, 1))# tile(a,reps): a :要复制的值 reps:复制的次数 本次案例中  (m,1) m:复制m行 1:复制1列normDataSet = normDataSet / tile(ranges, (m, 1))  # element wise dividereturn normDataSet, ranges, minVals

测试分类器

前面我们巳经提到可以使用错误率来检测分类器的性能。对于分类器来说,错误率就是分类 器给出错误结果的次数除以测试数据的总数,完美分类器的错误率为0 ,而错误率为1.0的分类器 不会给出任何正确的分类结果。代码里我们定义一个计数器变量,每次分类器错误地分类数据,计数器就加1, 程序执行完成之后计数器的结果除以数据点总数即是错误率。

# 测试分类器
def datingClassTest(filename):hoRatio = 0.1      # 随机取数据集的10% 海伦提供的数据集本身是无序的  所以这里直接取10%datingDataMat,datingLabels = file2matrix(filename)       # 加载原始数据# 查看散点图printData(datingDataMat)normMat, ranges, minVals = autoNormal(datingDataMat)                  # 加载归一化数据m = normMat.shape[0]numTestVecs = int(m*hoRatio)    # 取得10%数据errorCount = 0.0                  # 错误预测数初始化for i in range(numTestVecs):classifierResult = classify0(normMat[i, :], normMat[numTestVecs:m, :], datingLabels[numTestVecs:m], 3)print("the classifier came back with: %s, the real answer is: %s" % (classifierResult, datingLabels[i]))# the classifier came back with: largeDoses, the real answer is: largeDoses# the classifier came back with: smallDoses, the real answer is: smallDoses# the classifier came back with: didntLike, the real answer is: didntLikeif (classifierResult != datingLabels[i]): errorCount += 1.0print("the total error rate is: %d" % ((errorCount/float(numTestVecs))*100), "%")print(errorCount)# the total error rate is: 5 %# 5.0if __name__ == '__main__':datingClassTest("datingTestSet.txt")

总结

测试结果错误率为5%,也就是我们有95%的正确率,看起来还不错!
我们可以改变函数datingClassTest内变量hoRatio和变量K的值,检测错误率是否随着变量值的变化而增加。依 赖于分类算法、数据集和程序设置,分类器的输出结果可能有很大的不同。
有兴趣的小伙伴可以自己创造一些数据 来测试一下自己会不会得到海伦的芳心哦

K-近邻算法(二): 案例实践_海伦约会案例相关推荐

  1. 一文搞懂K近邻算法(KNN),附带多个实现案例

    简介:本文作者为 CSDN 博客作者董安勇,江苏泰州人,现就读于昆明理工大学电子与通信工程专业硕士,目前主要学习机器学习,深度学习以及大数据,主要使用python.Java编程语言.平时喜欢看书,打篮 ...

  2. K近邻算法的 MATLAB 实践

    使用背景: 基于 KNN 的相关算法,已成功应用于手写体识别.数字验证识别.文本识别.聚类分析.预测分析.模式识别.图像处理等. 操作步骤: 对于如何实现 KNNKNNKNN 算法,针对传统 KNNK ...

  3. 模式识别和机器学习实战-K近邻算法(KNN)- Python实现 - 约会网站配对效果判断和手写数字识别

    文章目录 前言 一. k-近邻算法(KNN) 1.算法介绍 2.举个例子--电影分类 3.步骤描述 4.来了--代码实现 二.实战之约会网站配对效果判断 1.导入数据 2.分析数据 3.数据归一化 4 ...

  4. 机器学习第七章之K近邻算法

    K近邻算法(了解) 7.1 K近邻算法 7.1.1 K近邻算法的原理介绍 7.1.2 K近邻算法的计算步骤及代码实现 7.2 数据预处理之数据归一化 7.2.1 min-max标准化 7.2.2 Z- ...

  5. k近邻算法_【白话机器学习】算法理论+实战之K近邻算法

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支 ...

  6. 09_分类算法--k近邻算法(KNN)、案例、欧氏距离、k-近邻算法API、KNeighborsClassifier、及其里面的案例(网络资料+学习资料整理笔记)

    1 分类算法–k近邻算法(KNN) 定义:如果一个样本在特征空间中**k个最相似(即特征空间中最邻近)**的样本中的大多数属于某一个类别,则该样本也属于这个类别,则该样本也属于这个类别. k-近邻算法 ...

  7. k近邻算法原理c语言,实验二 K-近邻算法及应用

    作业信息 一.[实验目的] 理解K-近邻算法原理,能实现算法K近邻算法: 掌握常见的距离度量方法: 掌握K近邻树实现算法: 针对特定应用场景及数据,能应用K近邻解决实际问题. 二.[实验内容] 实现曼 ...

  8. 机器学习实战第二章K近邻算法照葫芦画瓢实践。

    分别实现了最基本的3个DEMO 1.给你若干个带有标签的二维点作为训练集,给定一系列的二维随机点,看其通过训练集,可以被分为哪一类 2.给你N个人的飞行里程数,玩游戏消耗时间百分比和每周消耗冰激凌的公 ...

  9. k近邻算法C++二维情况下的实现

    k近邻算法C++二维实现 这是一个k近邻算法的二维实现(即K=2的情况). #include <cstdio> #include <cstring> #include < ...

最新文章

  1. [个人博客作业Week7]软件工程团队项目感想与反思
  2. JavaScript中的call、apply、bind深入理解
  3. 构建一个计算机网络,计算机网络--网络构建(一)
  4. 数据库视频总结四(存储过程和触发器)
  5. xml+dom4j+xpath学生管理系统
  6. 《Python machine learning and practice》—— 良\恶性乳腺癌肿瘤预测
  7. 【litrpa专题】首个rpa程序,使用litrpa采集百度地图地铁数据
  8. 计算机启动硬盘响,电脑开机时硬盘响个不停是什么原因?原因分析与解决方法介绍...
  9. 在java中excel格式变为zip什么原因_Excel工作表中最常见的8类问题,你一定遇到过,附解决方法!...
  10. php 数组的深度,有没有办法找出PHP数组的“深度”?
  11. tf.image.crop_and_resize()使用
  12. 多线程中redistemplate不执行_在 Flink 算子中使用多线程如何保证不丢数据?
  13. 403. Frog Jump
  14. 月光下的凤尾竹—彩云之南西双版纳游记
  15. 张飞实战电子1-31部 和硬件工程师90天学习资料及笔记汇总
  16. 关于苹果手机部分版本机型上传时卡住相册问题记录
  17. Zabbix -- 客户端安装以及如何添加数据库的动态监控视图
  18. “知识库系统”的一些思考
  19. 拼多多评价过滤哪些内容?应该怎么办?
  20. python 角度传感器模拟_Arduino300度模拟旋转角度传感器

热门文章

  1. react前端ui的使用_使用React Morph变形UI过渡
  2. 微生物如何影响我们的生活
  3. JavaScript学习笔记——对象和数组(上)
  4. 高考专科分数计算机,2017年高考全国各省高职专科,录取分数线陆续公布
  5. 电子学生计算机怎么玩游戏,大三学生自曝电脑耗时:2年半340402分钟
  6. 全球及中国PTA(纯对苯二甲酸)市场竞争力及投资可行性分析报告2022~2028年
  7. AE渲染后的视频文件播放时很卡,不流畅
  8. 面向计算机的问题分析,计算机论文:面向中文问答系统问题分析与答案抽取方法之计算机研究.docx...
  9. 基于insightface实现的人脸识别和人脸注册
  10. 中兴回应被列入被执行人名单;摩拜否认裁员 30%;LG 支持韩国对高通罚款 9 亿美元 | 雷锋早报...