使用k-近邻算法改进约会网站的配对效果

news/2024/5/10 21:25:17/文章来源:https://blog.csdn.net/weixin_33991418/article/details/92444190

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

问题描述

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

  • 不喜欢的人
  • 魅力一般的人
  • 极具魅力的人

尽管发现了上述规律,但海伦依然无法将约会网站推荐的匹配对象归人恰当的分类。她觉得可以在周一到周五约会那些魅力一般的人,而周末则更喜欢与那些极具魅力的人为伴。海伦为了可以更好将匹配对象划分到确切的分类中,收集了1000个相关样本数据。海伦的样本数据包含以下3种特征:

  • 每年获得的飞行常客里程数
  • 玩视频游戏所耗时间百分比
  • 每周消费的冰淇淋公升数

接下来将用kNN算法通过1000个相关样本的解决海伦的问题。

算法过程

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

算法详细步骤

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

在将上述特征数据输人到分类器之前,必须将待处理数据的格式改变为分类器可以接受的格式。 原始数据部分截图: 原始数据格式

def file2matrix(filename):"""将文本记录转换为NumPy解析程序:param filename: 文件名称:return: 特征矩阵、样本分类向量"""fr = open(filename)array_of_lines = fr.readlines()number_of_lines = len(array_of_lines)matrix_of_return = np.zeros((number_of_lines, 3))class_of_label_vector = []index = 0for line in array_of_lines:line = line.strip()list_of_line = line.split('\t')matrix_of_return[index, :] = list_of_line[0:3]# 列表中最后一项存入class_of_label_vector中class_of_label_vector.append(int(list_of_line[-1]))index += 1return matrix_of_return, class_of_label_vector

分析数据:散点图

使用matrix_of_return矩阵的第二、第三列数据,分别表示特征值“玩视频游戏所耗时间百分比”和“每周所消费的冰淇淋公升”绘制散点图。 散点图

def draw_scatter(matrix_of_dating, labels_of_dating, xlabel, ylabel):"""绘制散点图"""plt.rcParams['font.sans-serif'] = ['SimHei']fig = plt.figure()ax = fig.add_subplot(111)ax.scatter(x=matrix_of_dating[:, 1], y=matrix_of_dating[:, 2],s=15.0*np.array(labels_of_dating), c=15.0*np.array(labels_of_dating))ax.set_xlim([0.0, 25.0])ax.set_ylim([0.0, 2.0])ax.set_xlabel(xlabel)ax.set_ylabel(ylabel)plt.show()

准备数据:归一化数值

每年获取的飞行常客里程数对于计算结果的影响将远远大于其他两个特征(玩视频游戏的和每周消费冰洪淋公升数)的影响。而产生这种现象的唯一原因,仅仅是因为飞行常客里程数远大于其他特征值。但这三种特征是同等重要的,因此作为三个等权重的特征之一,飞行常客里程数并不应该如此严重地影响到计算结果。因此我们需要将任意取值范围的特征值转化为0到1区间内的值。这样三个等权重的特征值就在程序中变得同等重要。

def auto_norm(data_set):"""归一化特征值此数值归一化公式:new_value = (old_value-min)/(max-min):param data_set: 数据集"""min_vals = data_set.min(0)  # 每一列中的最小值,data_set.min(0) 其中参数0可以使函数从列中选出最小值max_vals = data_set.max(0)ranges = max_vals - min_valsnorm_data_set = np.zeros(np.shape(data_set))m = data_set.shape[0]norm_data_set = data_set - np.tile(min_vals, (m, 1))norm_data_set = norm_data_set / np.tile(ranges, (m, 1))return norm_data_set, ranges, min_vals

测试算法:作为完整程序验证分类器

已有数据的90%作为训练样本来训练分类器,而使用其余的10%数据去测试分类器,检测分类器的正确率。对于分类器来说,错误率就是分类器给出错误结果的次数除以测试数据的总数,完美分类器的错误率为0,而错误率为1.0的分类器不会给出任何正确的分类结果。

def dating_class_test(filename, matrix_of_dating, labels_of_dating):"""分类器针对约会网站的测试代码错误率计算公式:分类器给出的错误结果的次数/测试数据的总数:param filename: 文件位置:return: None"""ratio_of_ho = 0.10  # 10%的测试数据,90%的训练数据matrix_of_norm, ranges, min_vals = auto_norm(matrix_of_dating)m = matrix_of_norm.shape[0]num_of_test_vecs = int(m*ratio_of_ho)error_counts = 0.0for i in range(num_of_test_vecs):classifier_result = classify0(matrix_of_norm[i, :], matrix_of_norm[num_of_test_vecs:m, :],labels_of_dating[num_of_test_vecs:m], 3)print("the classifier came back with: %d, the real answer is: %d"% (classifier_result, labels_of_dating[i]))if classifier_result != labels_of_dating[i]:error_counts += 1.0print('the total error rate is %f' % (error_counts/float(num_of_test_vecs)))

使用算法

def classify_person(matrix_of_dating, labels_of_dating):"""约会网站预测函数"""print("Begin to predict\n")# 不喜欢的人、魅力一般的人、极具魅力的人result_list = ['not at all', 'in small doses', 'in large doses']percent_tats = float(input("percentage of time spent playing video games?\n"))  # 玩视频游戏所花时间百分比ff_miles = float(input("frequent filer miles earned per year?\n"))  # 每年获得的飞行常客里程数ice_creams = float(input("liters of ice cream consumed per year?\n"))matrix_of_dating, ranges, min_vals = auto_norm(data_set=matrix_of_dating)in_arr = np.array([ff_miles, percent_tats, ice_creams])classifier_result = classify0((in_arr-min_vals)/ranges, matrix_of_dating, labels_of_dating, 3)print("You will probably like this person: ", result_list[classifier_result-1])

全部代码

# -*- coding: utf-8 -*-
# @Function :  使用k-近邻算法改进约会网站配对效果
import numpy as np
import matplotlib.pyplot as plt
import operatordef classify0(in_x, data_set, labels, k):"""k-近邻算法:param in_x: 用于分类的输入向量X:param data_set: 输入的训练样本集data_set:param labels: 标签向量,其元素数目与矩阵data_set的行数相同:param k: 选择最近邻居的数目:return: 发生频率最高的元素标签"""dataset_size = data_set.shape[0]# 原型:numpy.tile(A,reps)# tile共有2个参数,A指待输入数组,reps则决定A重复的次数。整个函数用于重复数组A来构建新的数组。# 计算距离,欧式距离公式:sqrt(pow(xA0-xB0, 2) + pow(xA1-xB1, 2))diff_mat = np.tile(in_x, (dataset_size, 1)) - data_setsq_diff_mat = diff_mat ** 2sq_distances = sq_diff_mat.sum(axis=1)distances = sq_distances ** 0.5# numpy.argsort() 返回排好序的序列的索引sorted_dist_indicies = distances.argsort()class_count = {}# 选择距离最小的k个节点for i in range(k):vote_I_label = labels[sorted_dist_indicies[i]]class_count[vote_I_label] = class_count.get(vote_I_label, 0) + 1sorted_class_count = sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)return sorted_class_count[0][0]def file2matrix(filename):"""将文本记录转换为NumPy解析程序:param filename: 文件名称:return: 特征矩阵、样本分类向量"""fr = open(filename)array_of_lines = fr.readlines()number_of_lines = len(array_of_lines)matrix_of_return = np.zeros((number_of_lines, 3))class_of_label_vector = []index = 0for line in array_of_lines:line = line.strip()list_of_line = line.split('\t')matrix_of_return[index, :] = list_of_line[0:3]# 列表中最后一项存入class_of_label_vector中class_of_label_vector.append(int(list_of_line[-1]))index += 1return matrix_of_return, class_of_label_vectordef draw_scatter(matrix_of_dating, labels_of_dating, xlabel, ylabel):"""绘制散点图"""plt.rcParams['font.sans-serif'] = ['SimHei']fig = plt.figure()ax = fig.add_subplot(111)ax.scatter(x=matrix_of_dating[:, 1], y=matrix_of_dating[:, 2],s=15.0*np.array(labels_of_dating), c=15.0*np.array(labels_of_dating))ax.set_xlim([0.0, 25.0])ax.set_ylim([0.0, 2.0])ax.set_xlabel(xlabel)ax.set_ylabel(ylabel)plt.show()def auto_norm(data_set):"""归一化特征值此数值归一化公式:new_value = (old_value-min)/(max-min):param data_set: 数据集:return:"""min_vals = data_set.min(0)  # 每一列中的最小值,data_set.min(0) 其中参数0可以使函数从列中选出最小值max_vals = data_set.max(0)ranges = max_vals - min_valsnorm_data_set = np.zeros(np.shape(data_set))m = data_set.shape[0]norm_data_set = data_set - np.tile(min_vals, (m, 1))norm_data_set = norm_data_set / np.tile(ranges, (m, 1))return norm_data_set, ranges, min_valsdef dating_class_test(filename, matrix_of_dating, labels_of_dating):"""分类器针对约会网站的测试代码错误率计算公式:分类器给出的错误结果的次数/测试数据的总数:param filename: 文件位置:return: None"""ratio_of_ho = 0.10  # 10%的测试数据,90%的训练数据matrix_of_norm, ranges, min_vals = auto_norm(matrix_of_dating)m = matrix_of_norm.shape[0]num_of_test_vecs = int(m*ratio_of_ho)error_counts = 0.0for i in range(num_of_test_vecs):classifier_result = classify0(matrix_of_norm[i, :], matrix_of_norm[num_of_test_vecs:m, :],labels_of_dating[num_of_test_vecs:m], 3)print("the classifier came back with: %d, the real answer is: %d"% (classifier_result, labels_of_dating[i]))if classifier_result != labels_of_dating[i]:error_counts += 1.0print('the total error rate is %f' % (error_counts/float(num_of_test_vecs)))def classify_person(matrix_of_dating, labels_of_dating):"""约会网站预测函数"""print("Begin to predict\n")# 不喜欢的人、魅力一般的人、极具魅力的人result_list = ['not at all', 'in small doses', 'in large doses']percent_tats = float(input("percentage of time spent playing video games?\n"))  # 玩视频游戏所花时间百分比ff_miles = float(input("frequent filer miles earned per year?\n"))  # 每年获得的飞行常客里程数ice_creams = float(input("liters of ice cream consumed per year?\n"))matrix_of_dating, ranges, min_vals = auto_norm(data_set=matrix_of_dating)in_arr = np.array([ff_miles, percent_tats, ice_creams])classifier_result = classify0((in_arr-min_vals)/ranges, matrix_of_dating, labels_of_dating, 3)print("You will probably like this person: ", result_list[classifier_result-1])if __name__ == '__main__':# 可视化分析数据filename = './Data/Ch02/datingTestSet2.txt'matrix_of_dating, labels_of_dating = file2matrix(filename)draw_scatter(matrix_of_dating, labels_of_dating,'玩视频游戏所耗时间百分比', '每周消耗的冰淇淋公升数')dating_class_test(filename, matrix_of_dating, labels_of_dating)classify_person(matrix_of_dating, labels_of_dating)

运行结果

运行结果

本文内容引自《Python 机器学习实战》

转载于:https://my.oschina.net/chenmoxuan/blog/1819600

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_726374.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站设计欣赏:20个另类的单页网站作品案例

早在1月份,我向大家分享了《谈谈构建单页布局网站的创意技术》,随着单页设计得到越来越多的设计师的关注,今天我们决定向您展示一组鼓舞人心的单页网站例子,一起欣赏。 您可能感兴趣的相关文章经典网页设计:超炫动画效…

百度熊掌号seo名称的唯一性,造就熊掌号占坑思考

相信申请熊掌号的朋友都注意到这问题,熊掌号名称是唯一的,一个人用了这个名称其他人就不能使用了。因为这种策略就激发了一些人群的占位思想,占领一个名称或许将来也是一大笔收入,就和当年微博名称的稀缺性有点雷同。相信近期在手…

虚拟机linux装oracle10g教程,配置虚拟机 - Vmware+Linux+Oracle 10G RAC全程详细图解_数据库技术_Linux公社-Linux系统门户网站...

一个新的虚拟机建立好之后,不要忙着立即投入使用,因为我们还要在里面指定光驱所对应的安装介质,还要添加诸如磁盘、网卡,来满足实验所需。当然,我们也可以在实验进行过程中再根据需要来添加,不过那样比较麻…

dw打开主页index.html,崇文[SEO优化]如何去掉网站主页的index.html_常见问题_知了网络...

在一、首页网址中“index.html”消除方法这里有三种方法可以实现:1.将dedecms网站根目录下的index.php改成index.php.bak或者删除掉,生成静态首页。2. 就是登陆到你的网站空间控制面板中,将默认首页index.html的优先级设置为最高。一般的主机…

dell 服务器 非官方网站,教你如何在非官方渠道购买DELL电脑。

首先声明一点。DELL的笔记本是网上直销,在电脑城购买的DELL笔记本“可能”(这是引用某销售代表的话)会加入黑名单,失去保修,请权衡。很多人担心的问题是,在非dell官方认可渠道购买dell的产品会不会得到保障。是否会有产品内部配置…

python bottle框架 网站_用python web框架 bottle 开发网站(二)

在第一节我们了解了bottle框架的基本使用,并写出了一个简单的hello欢迎页面,接下来我们用bottle实现及其简单的欢迎页面。# main.pyfrom bottle import run,route,templateroute("/")def index(name):return template(index,username name)ru…

益阳计算机考试成绩查询,2019湖南益阳公务员考试笔试成绩查询|成绩排名查询网站...

湖南省2019年公务员考试阅卷工作已经结束,现将笔试成绩予以发布。考生可登陆红星网(http://www.hxw.gov.cn)“湖南省2019年考试录用公务员专题”或湖南省人事考试院官网(http://www.hunanpea.com)查询成绩。为确保新录用公务员基本素质,根据《湖南省2019…

华为解锁网站停止服务器,华为重要服务宣布终止!

近日,华为官方发布公告称,因业务发展策略调整,“华为云电脑”将于北京时间2021年8月15日23点59分停止服务和运营,届时及以后您将无法登录和使用。据悉,在此之前,有效套餐仍可连接使用,停服后数据…

百度网站的服务器错误怎么办,如何解决http500内部服务器错误减少百度爬虫的链接丢失...

在SEO工作过程中,我们偶尔会遇到http500内部服务器错误,这样的问题,它是一个明显的http状态码,它告诉站长,你的网站和服务器一定的配置问题。优帮云发现从SEO的角度来看,如果你不能及时解决相关问题&#x…

单页应用SEO浅谈

为什么80%的码农都做不了架构师?>>> 单页应用SEO浅谈 前言 单页应用(Single Page Application)越来越受web开发者欢迎,单页应用的体验可以模拟原生应用,一次开发,多端兼容。单页应用并不是一…

网站开发和企业级开发有什么区别?

2019独角兽企业重金招聘Python工程师标准>>> 经常看到Web开发、网站开发、企业级开发,以前很难分清楚它们之前有什么不同?以前也有个说法:Java比较适合企业级开发。 现在经验增加了一点,谈谈我的一点看法。 Web开发&am…

git的使用笔记-转自廖前辈的网站

2019独角兽企业重金招聘Python工程师标准>>> ------- GIT安装 ------- 1.linux安装git sudo apt-get install git 老一点: sudo apt-get install git-core 2.maxOS安装git brew install git 3.windows安装git msysgit是Windows版的Git,从ht…

Vue 实现 Hover 功能( mouseover 与 mouseenter 的区别)

一、mouseover 和 mouseenter 的区别 mouseover:当鼠标移入元素或其子元素都会触发事件,所以有一个重复触发,冒泡过程。对应的移除事件是 mouseout mouseenter:当鼠标移入元素本身(不包含元素的子元素)会触发事件&…

家乡介绍网站模板html_网站被挂黑链怎么办

我们都知道做SEO优化经常会碰到网站被挂黑链问题,遇到这种问题我们不用担心,下面由水滋源郑州网站优化公司介绍几种轻松解决网站被挂黑链问题。 黑链手法:一般的黑链在网站的首页是不能看出来的,他们采取了很隐秘的手法&#xff0…

python爬取网页信息的相关库_Python基于requests库爬取网站信息

requests库是一个简介且简单的处理HTTP请求的第三方库 get()是获取网页最常用的方式,其基本使用方式如下 使用requests库获取HTML页面并将其转换成字符串后,需要进一步解析HTML页面格式,这里我们常用的就是beautifulsoup4库,用于解…

使用代理请求其他网站图片时,报403错误

需求&#xff1a;通过请求代理网址&#xff0c;获取数据&#xff0c;渲染页面&#xff1b; 问题&#xff1a;请求不到图片&#xff0c;报403错误。 解决办法&#xff1a;在 head 标签中添加一个下面的标签 <meta name"referrer" content"no-referrer"&…

邮箱@topgrid.cn是什么网站_出海企业建立的新网站如何快速增加权重?

2019年1月21日更新&#xff1a;这种方法在2018年下半年已经被Google惩罚了&#xff0c;大家慎用&#xff01;现如今把产品或服务卖给外国人&#xff0c;无论是B2B还是B2C&#xff0c;依托平台&#xff08;亚马逊&#xff0c;阿里巴巴等&#xff09;都难免受平台的制约。尤其是亚…

linux下Apache软件搭建网站

前面我讲解了Web服务器的分类与架构演变&#xff0c;从单台机到多台机的架构&#xff0c;这是我们学习Linux网站服务的核心知识&#xff0c;后面我以这个架构为中心&#xff0c;展开讲解&#xff0c;在插入相应的别的内容。毕竟我们的工作是以网站为主。说道这里我想说下Linux运…

真人秀制作网站_设计干货:9个网站,带你领略设计师的开挂日常

之前微博上有一个很火的话题叫#美术生开挂日常#&#xff0c;不知道大家看完后是否有被美术生们精湛的绘画技巧所折服。其实不仅仅是美术生&#xff0c;产品设计师们的日常更是无数的惊叹于大写的佩服。小麸今天就来和大家深入了解一下&#xff1a;产品设计师的开挂日常~01 产品…

网站该如何存储用户的密码

2019独角兽企业重金招聘Python工程师标准>>> 对那些有用户系统的网站来说&#xff0c;如果存储用户的密码是个问题。 大家都知道不能明文存储&#xff0c;这样一旦被脱了裤子&#xff0c;后果很严重&#xff0c; 简单的md5 sha加密也不可取...... 通常在做网站的时候…