k-近邻算法-优化约会网站的配对效果

news/2024/5/15 9:22:26/文章来源:https://blog.csdn.net/weixin_34081595/article/details/94476577

KNN原理

1. 假设有一个带有标签的样本数据集(训练样本集),其中包含每条数据与所属分类的对应关系。

2. 输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较。

  a. 计算新数据与样本数据集中每条数据的距离。

  b. 对求得的所有距离进行排序(从小到大,越小表示越相似)

  c. 取前 k (k 一般小于等于 20 )个样本数据对应的分类标签

3. 求 k 个数据中出现次数最多的分类标签作为新数据的分类

通俗的说:给定一个数据集,对新的输入实例,在训练集中找到与该实例最邻近的k个实例,这k个实例的多数属于某个类,就把这个新输入实例分为这个类

项目案例1: 优化约会网站的配对效果

海伦使用约会网站寻找约会对象。经过一段时间之后,她发现曾交往过三种类型的人:

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

她希望:

  1. 工作日与魅力一般的人约会
  2. 周末与极具魅力的人约会
  3. 不喜欢的人则直接排除掉

1. 将文本记录转换为 NumPy 的解析程序

from matplotlib.font_manager import FontProperties
import matplotlib.lines as mlines
import matplotlib.pyplot as plt
import numpy as np
from numpy import *
import matplotlib
import operator
def file2matrix(filename):"""导入训练数据:param filename: 数据文件路径:return: 数据矩阵returnMat和对应的类别classLabelVector"""fr = open(filename)# 获得文件中的数据行的行数numberOfLines = len(fr.readlines())# 生成对应的空矩阵# 例如:zeros(2,3)就是生成一个 2*3的矩阵,各个位置上全是 0 returnMat = zeros((numberOfLines, 3))  # prepare matrix to returnclassLabelVector = []  # prepare labels returnfr = open(filename)index = 0for line in fr.readlines():# str.strip([chars]) --返回移除字符串头尾指定的字符生成的新字符串line = line.strip()# 以 '\t' 切割字符串listFromLine = line.split('\t')# 每列的属性数据returnMat[index, :] = listFromLine[0:3]# 每列的类别数据,就是 label 标签数据classLabelVector.append(int(listFromLine[-1]))index += 1# 返回数据矩阵returnMat和对应的类别classLabelVectorreturn returnMat, classLabelVector

2. 使用Matplotlib创建散点图

import matplotlib
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(datingDataMat[:, 0], datingDataMat[:, 1], 15.0*array(datingLabels), 15.0*array(datingLabels))
plt.show()

3. 归一化特征值,消除特征之间量级不同导致的影响

def autoNorm(dataSet):"""Desc:归一化特征值,消除特征之间量级不同导致的影响parameter:dataSet: 数据集return:归一化后的数据集 normDataSet. ranges和minVals即最小值与范围,并没有用到归一化公式:Y = (X-Xmin)/(Xmax-Xmin)其中的 min 和 max 分别是数据集中的最小特征值和最大特征值。该函数可以自动将数字特征值转化为0到1的区间。"""# 计算每种属性的最大值、最小值、范围minVals = dataSet.min(0)maxVals = dataSet.max(0)# 极差ranges = maxVals - minValsnormDataSet = zeros(shape(dataSet))m = dataSet.shape[0]# 生成与最小值之差组成的矩阵normDataSet = dataSet - tile(minVals, (m, 1))# 将最小值之差除以范围组成矩阵normDataSet = normDataSet / tile(ranges, (m, 1))  # element wise dividereturn normDataSet, ranges, minVals
normMat, ranges, minVals = autoNorm(datingDataMat)
normMat
array([[0.44832535, 0.39805139, 0.56233353],[0.15873259, 0.34195467, 0.98724416],[0.28542943, 0.06892523, 0.47449629],...,[0.29115949, 0.50910294, 0.51079493],[0.52711097, 0.43665451, 0.4290048 ],[0.47940793, 0.3768091 , 0.78571804]])

4. K近邻算法

def classify0(inX, dataSet, labels, k):"""inX: 用于分类的输入向量dataSet: 输入的训练样本集labels: 标签向量k: 选择最近邻居的数目注意:labels元素数目和dataSet行数相同;程序使用欧式距离公式."""# 求出数据集的行数dataSetSize = dataSet.shape[0]# tile生成和训练样本对应的矩阵,并与训练样本求差"""tile: 列: 3表示复制的行数, 行:1/2 表示对inx的重复的次数例:In []: inX = [1, 2, 3]tile(inx, (3, 1))Out[]: array([[1, 2, 3],[1, 2, 3],[1, 2, 3]])"""# 用inx(输入向量)生成和dataSet类型一样的矩阵,在减去dataSetdiffMat = tile(inX, (dataSetSize, 1)) - dataSet# 取平方sqDiffMat = diffMat ** 2# 将矩阵的每一行相加sqDistances = sqDiffMat.sum(axis=1)# 开方distances = sqDistances ** 0.5# 根据距离排序从小到大的排序,返回对应的索引位置# argsort() 是将x中的元素从小到大排列,提取其对应的index(索引),然后输出到y。"""In [] : y = argsort([3, 0, 2, -1, 4, 5])print(y[0])print(y[5])Out[] : 35由于最小的数是-1,它的序号是3,因此y[0] = 3, 最大的数是5,它的序号是5,因此y[5] = 5"""sortedDistIndicies = distances.argsort()# 2. 选择距离最小的k个点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]  

5. 分类器针对约会网站的测试代码

def datingClassTest():"""对约会网站的测试方法:return: 错误数"""# 设置测试数据的的一个比例(训练数据集比例=1-hoRatio)hoRatio = 0.1  # 测试范围,一部分测试一部分作为样本# 从文件中加载数据datingDataMat, datingLabels = file2matrix('F:/迅雷下载/machinelearninginaction/Ch02/datingTestSet2.txt')  # load data setfrom file# 归一化数据normMat, ranges, minVals = autoNorm(datingDataMat)# m 表示数据的行数,即矩阵的第一维m = normMat.shape[0]# 设置测试的样本数量, numTestVecs:m表示训练样本的数量numTestVecs = int(m * hoRatio)print('numTestVecs=', numTestVecs)errorCount = 0.0for i in range(numTestVecs):# 对数据测试classifierResult = classify0(normMat[i, :], normMat[numTestVecs:m, :], datingLabels[numTestVecs:m], 3)print("the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i]))if (classifierResult != datingLabels[i]): errorCount += 1.0print("the total error rate is: %f" % (errorCount / float(numTestVecs)))print(errorCount)

numTestVecs= 100
the classifier came back with: 3, the real answer is: 3
the classifier came back with: 2, the real answer is: 2
the classifier came back with: 1, the real answer is: 1

....

the classifier came back with: 1, the real answer is: 1
the classifier came back with: 3, the real answer is: 1
the total error rate is: 0.050000
5.0

转载于:https://www.cnblogs.com/gezhuangzhuang/p/9978401.html

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

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

相关文章

一个网站大概多少钱_建一个外贸网站大概需要多少钱?角点科技总结建外贸网站的费用...

建一个外贸网站大概需要多少钱?小编经常遇到客户问:建一个网站需要多少钱;小编一般都是问:可以说说你的需求吗?是搭建什么类型呢?建站主要目的是什么? 因为小编一直认为网站的价格是看客户的需求…

大型网站技术架构(二)架构模式

2019独角兽企业重金招聘Python工程师标准>>> 每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复工作。 所谓网站架构模式即为了解决大型网站面临的高并发访问、海量数据、高可靠…

移动端媒体尺寸_网络推广外包浅析提升移动端网站建设效率有哪些网络推广外包技巧-企服...

相信许多站长有所耳闻,在当下的谷歌浏览器搜索中,要求PC端网站具备移动端网站才能更好的促进网站优化运营,这也标志着当下网络市场中移动端网站建设的必要性。移动端网站与PC端网站设计不同,有很多开发细节需要站长掌握&#xff0…

不同网站不同网卡_弄清高端网站建设的独特不同之处才能做好网站

弄清高端网站建设的独特不同之处才能做好网站网站并不总是只是互联网上的一个虚拟目的地,有时它是一种独特的存在,它为客户提供了无与伦比的体验。这种体验令人难忘,而且毫不费力地为用户提供了他们需要的准确信息。高端网站建设和普通网站建…

怎么把一个网页作为背景套在另一个网页上_设计科技公司网站背景的六个小技巧...

我们都知道,任何网站的背景对于网站如何影响我们都至关重要,尤其是在设计科技公司网站的时候表现的更加明显。背景对访问者及其用户对网站的认知程度有多大影响。以前网站没有背景,内容被放置在纯白色背景上。但是随着时间的流逝,…

网站备案负责人_三分钟教你如何做好网站备案

根据国家的相关法律要求,若使用中国大陆地区服务器开办网站,或提供其他类似的网络信息服务,需要依法进行备案。通过域名访问网站、浏览网站内容时,此网站会被解析到某地的服务器上,每个网站背后需要有对应运营单位、单…

dedecms和php有什么关系,dedecms和用PHP自己编写的程序做网站有什么区别?哪一种更好一点...

Dedecms也称做DedeCMS以简单、健壮、灵活、开源几大特点占领了国内CMS的大部份市场,目前已经有超过35万个站点正在使用DedeCMS或基于DedeCMS核心开发,产品安装量达到95万(这个数字来自于官方统计可能远远不止这些)。织梦cms是开源的程序现在也有很多所谓…

wcf编程用什么工具_四个强大的自学编程网站工具,用的人都是学习欲望很强!...

今天给大家分享几个自学编程的网站工具,希望可以帮到正在努力自学的你!~~慕课网很多朋友都在想如何学习软件开发,这个自学开发的网站确实好用,一款专业的在线编程学习平台,早期的发展有很多免费的课程,对于…

window.open怎么设置title_企业seo怎么优化 都有那些策略?

seo怎么优化,做seo优化也需要讲究策略,策略不太对路的话,可能效果就差强人意。搜索引擎优化技术知识好掌控,但是如何灵活运用,并能做出效果,则是需要深入研究和实践的了。面对一个网站,seo怎么优…

seo 伪原创_seo伪原创工具(解析新云查新型伪原创模式工具)

现在内容为王,外链为皇的互联网时代大家对文章内容的质量越来越看重,SEOer们在做内容时原创文章内容时最好的,当然伪原创文章也是一大部分SEOer的选择。文章做伪原创的方法有的人是手动做伪原创,而有的人是依靠伪原创工具做伪原创…

idea中浏览器打开页面404_深圳网站建设中的404页面有什么用

通常我们访问网站时,遇到404页面会让人很扫兴,想想正在兴致勃勃的看新闻、找资料、看视频等等,突然出现一个巨大的404,告诉你找的东西不存在,是不是有种想砸键盘的冲动?可偏偏有很多404页面让你看到之后不仅…

无人机官方网站_无人机开发设计资料整理

无人机技术作为前沿技术,吸引了不少技术宅男的追捧。越来越多的人开始加入无人机技术的学习与研究中,然而却苦于找不到太多的相关资源。阿木实验室根据多年无人机的从业经验,为大家整理了一份资料。资料不全,欢迎大家留言补充。一…

php中引入jquery文件_WP模板开发中,怎样给wordpress网站的文章,添加点赞功能?...

我们在网上浏览某些网站的文章时,在文章的结尾处,都会有一个点赞的按钮,如果觉得文章内容非常不错,就可以点击这个“点赞”按钮,给这篇文章进行点赞一下。在wordpress网站的模板主题开发中,我们可不可以也为…

重启服务器导致网站系统错误,win10怎么总是莫名其妙重启?_网站服务器运行维护...

win10如何恢复输入法语言栏?_网站服务器运行维护win10恢复输入法语言栏的方法:1、先打开设置,然后进入“时间和语言”;2、点击“区域和语言”,接着找到“高级键盘设置”,点进去。3、找到“切换输入法”&…

优酷、YouTube、Twitter及JustinTV视频网站架构设计笔记

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!本文是整理的关于优酷、YouTube、Twitter及J…

Sun公司网站上的Swing实例,想学Swing的不看后悔

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!因为公司要做一点关于Swing方面的&#xff0…

php 旅游网毕业论文,旅游网站毕业设计论文(优质范文6篇)

随着社会经济的发展,人民生活水平的大幅提高,旅游也变得越来越大众化。旅游网站可以实现消费者预先对旅游质量和特点进行详细的了解和感知。下面是旅游网站毕业设计论文6篇,供大家阅读指正。旅游网站毕业设计论文第一篇:JSPMySQL技术下旅游网站系统的设计…

服务器网站链接ip限制,apache服务器对同一IP地址的连接限制

要使apache服务器做对同一IP地址的连接限制,需要mod_limitipconn来实现。一般需要手动编译。不过模块作者也提供了一些编译好的模块,根据自己的apache版本可以直接使用。1。编译方式:tar zxvf mod_limitipconn-0.XX.tar.gzcd mod_limitipconn…

接触mybatisplus单页500条限制_单页网站制作教程,单页网站设计五大技巧

单页网站制作教程,单页网站设计五大技巧,单页设计已然是网页设计的大趋势了,许多流行的设计元素和设计方法都逐渐与这种网页设计手法融合到一起,越来越多的设计师和企业机构开始选择单页网站作为他们沟通世界的门户,而…

华为抓取错误日志在哪里_抓取网址进行分析爬虫工具Screaming Frog SEO Spider for Mac...

Screaming Frog SEO Spider for Mac是一款专门用于抓取网址进行分析的网络爬虫开发工具,你可以通过这款软件来快速抓取网站中可能出现的损坏链接和服务器错误,或是识别网站中临时、永久重定向的链接循坏,同时还能检查出网址、网页标题、说明以…