机器学习(三)-- KNN(K近邻分类算法)、电影分类、改进约会网站的配对效果

news/2024/5/20 15:30:56/文章来源:https://blog.csdn.net/qq_22473611/article/details/88352077

  决策树< 朴素贝叶斯< KNN

K近邻算法:根据距离来做排序,距离哪些同类的数据比较近则属于哪一类

(1)从计算结果直观上来看,在这三种算法中,KNN算法的计算准确率普遍较高,且kNN算法在训练数据与测试数据的比例为9:1时,其准确率达到90%以上。 
但是在每次计算测试数据的类别时,都要进行与训练数据的比较。在这种情况下,其复杂度随着数据量的增大而迅速增长。 
(2)决策树在递归地产生决策树时,其枝叶较繁杂,且对未知的测试数据的分类却没那么准确,会出现过拟合现象。 
在简化决策树为二叉树后,其准确率提高,且二叉树型的决策树在分类时更加简洁。但对于连续性数据,首先应该将数据进行离散化才能使用决策树。 
(3)朴素贝叶斯算法在拉普拉斯平滑修正后,其性能在kNN和决策树之间,但相对于kNN算法,朴素贝叶斯算法的准确率较之低。   
朴素贝叶斯算法的优点在于其在数据量较少时仍然适用,且对于多种属性的数据集的效果良好。但其不适用于连续性数据,只能用于离散数据。

 

一、k-近邻算法原理

简单地说,K-近邻算法采用测量不同特征值之间的距离方法进行分类。

  • 优点:精度高、对异常值不敏感、无数据输入假定。
  • 缺点:时间复杂度高、空间复杂度高。
  • 适用数据范围:数值型和标称型。

 工作原理

存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。

一般来说,我们只选择样本数据集中前K个最相似的数据,这就是K-近邻算法中K的出处,

通常K是不大于20的整数。 
最后 ,选择K个最相似数据中出现次数最多的分类,作为新数据的分类。

 

    

欧几里得距离(Euclidean Distance)

欧氏距离是最常见的距离度量,衡量的是多维空间中各个点之间的绝对距离。公式如下:

 

 

k-近邻算法步骤如下:

  1. 计算已知类别数据集中的点与当前点之间的距离;
  2. 按照距离递增次序排序;
  3. 选取与当前点距离最小的k个点;
  4. 确定前k个点所在类别的出现频率;
  5. 返回前k个点所出现频率最高的类别作为当前点的预测分类。

比如,现在我这个k值取3,那么在电影例子中,按距离依次排序的三个点分别是动作片(108,5)、动作片(115,8)、爱情片(5,89)。在这三个点中,动作片出现的频率为三分之二,爱情片出现的频率为三分之一,所以该红色圆点标记的电影为动作片。这个判别过程就是k-近邻算法。 

import numpy as npdef createDataSet():"""创建数据集"""# 每组数据包含打斗数和接吻数;group = np.array([[3, 104], [2, 100], [1, 81], [101, 10], [99, 5], [98, 2]])# 每组数据对应的标签类型;labels = ['Roman', 'Roman', 'Roman', 'Action', 'Action', 'Action']return group, labelsdef classify(inx, dataSet, labels, k):"""KNN分类算法实现:param inx:要预测电影的数据, e.g.[18, 90]:param dataSet:传入已知数据集,e.g. group 相当于x:param labels:传入标签,e.g. labels相当于y:param k:KNN里面的k,也就是我们要选择几个近邻:return:电影类新的排序"""dataSetSize = dataSet.shape[0]  # (6,2) -- 6行2列 ===> 6 获取行数# tile会重复inx, 把它重复成(dataSetSize, 1)型的矩阵# (x1 - y1), (x2 - y2)diffMat = np.tile(inx, (dataSetSize, 1)) - dataSet# 平方sqDiffMat = diffMat ** 2# 相加, axis=1行相加sqDistance = sqDiffMat.sum(axis=1)# 开根号distance = sqDistance ** 0.5# 排序索引: 输出的是序列号index, 而不是值sortedDistIndicies = distance.argsort()# print(sortedDistIndicies)classCount = {}for i in range(k):# 获取排前k个的标签名;voteLabel = labels[sortedDistIndicies[i]]classCount[voteLabel] = classCount.get(voteLabel, 0) + 1sortedClassCount = sorted(classCount.items(),key=lambda d: float(d[1]),reverse=True)return sortedClassCount[0][0]if __name__ == '__main__':group, label = createDataSet()print(  group," \n ",  label," \n " )result = classify([18, 90], group, label, 5)print("\n测试的电影类型:", result)

二、改进约会网站的配对效果

2、项目数据

海伦收集约会数据已经有了一段时间,她把这些数据存放在文本文件datingTestSet.txt中,每个样本数据占据一行,总共有1000行。

datingTestSet.txt数据集下载

 海伦收集的样本数据主要包含以下3种特征:

1、每年获得的飞行常客里程数
2、玩视频游戏所消耗时间百分比
3、每周消费的冰淇淋公升数
数据格式如下 

 3、K-近邻算法的一般流程

(1)收集数据:提供文本文件。

(2)准备数据:使用Python解析文本文件。

(3)分析数据:使用Matplotlib画二维扩散图。

(4)测试算法:使用文本文件的部分数据作为测试样本,计算错误率。

(5)使用算法:错误率在可接受范围内,就可以运行k-近邻算法进行分类。

from numpy import *
import operator
from os import listdir
'''
使用 kNN 进行分类(约会网站配对) 
@param inX:用于分类的数据向量
@param dataSet:训练样本集
@param labels:标签向量
@param k:用于选择最近邻的数目计算当前点,与其余所有点的距离最短则被归为此类
'''def classify0(inX, dataSet, labels, k):dataSetSize = dataSet.shape[0]# 求inX与数据集中各个样本的欧氏距离diffMat = tile(inX, (dataSetSize, 1)) - dataSet  # numpy中的tile函数将inX复制为重复的dataSize个行和重复的1列,功能相当于MATLAB中的repmatsqDiffMat = diffMat ** 2sqDistances = sqDiffMat.sum(axis=1)  # 按照x轴相加distances = sqDistances ** 0.5sortedDistIndicies = distances.argsort()  # 从小到大排序后,返回索引# 字典,key存储第i小的标签值,value为标签的次数classCount = {}for i in range(k):voteIlabel = labels[sortedDistIndicies[i]]  # 取第i个小的标签值classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1  # 根据标签统计标签次数,如果没找到返回0。统计前k个候选者中标签出现的次数sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)  # operator.itemgetter(1) 按照第2个元素,即标签出现的次数对classCount从大到小排序# print(sortedClassCount)  # 测试结果 [('B', 2), ('A', 1)]return sortedClassCount[0][0]  # 返回最终的类别,即标签值key'''
读取文本记录,提取特征矩阵和标签向量
@param filename:文件名(如 datingTestSet2.txt)
'''
def file2matrix(filename):fr = open(filename)numberOfLines = len(fr.readlines())  # 得到文件行数returnMat = zeros((numberOfLines, 3))  # 构造一个numberOfLines行3列的全0矩阵,3列代表3个特征,用来存储特征classLabelVector = []  # 存储标签向量fr = open(filename)index = 0for line in fr.readlines():  # 读文件时,每一行都是一个字符串,故line就是一个字符串line = line.strip()  # 去掉一行字符串line的前后空格listFromLine = line.split('\t')  # 以 '\t' 为切片,切成List,存储各个特征和最后一行的标签值returnMat[index, :] = listFromLine[0:3]  # 存储特征classLabelVector.append(int(listFromLine[-1]))  # 存储标签值index += 1return returnMat, classLabelVector'''
归一化数值
@param dataSet:训练样本集
'''
def autoNorm(dataSet):minVals = dataSet.min(0)  # 0代表从列中取最小值maxVals = dataSet.max(0)ranges = maxVals - minValsnormDataSet = zeros(shape(dataSet))  # 构造一个和dataSet一样大小的矩阵m = dataSet.shape[0]normDataSet = dataSet - tile(minVals, (m, 1))normDataSet = normDataSet / tile(ranges, (m, 1))  # 特征值相除,得到正则化后的新值return normDataSet, ranges, minVals'''
# 测试归一化数值
datingDataMat, datingLabels = file2matrix('datingTestSet2.txt')
normMat, ranges, minVals = autoNorm(datingDataMat)
print(normMat)
print(ranges)
print(minVals)
'''
def datingClassTest():hoRatio = 0.08  # 随机挖去 10% 的数据作为测试集datingDataMat, datingLabels = file2matrix('datingTestSet2.txt')  # 加载数据文件normMat, ranges, minVals = autoNorm(datingDataMat)m = normMat.shape[0]numTestVecs = int(m * hoRatio)  # 随机挖去的行数errorCount = 0.0for i in range(numTestVecs):# 前numTestVecs条作为测试集(一个一个测试),后面的数据作为训练样本,训练样本的标签,3个近邻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 number of errr is: %d" % int(errorCount))print("The total error rate is: %f" % (errorCount / float(numTestVecs)))# 测试分类错误率,错误分类个数
datingClassTest()'''
the classifier came back with: 3, the real answer is: 3
………………
the classifier came back with: 3, the real answer is: 3
The number of errr is: 2
The total error rate is: 0.025000
'''

 

 

 

 

 

 

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

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

相关文章

【大型分布式网站】抗住千万流量的大型分布式系统架构设计

一、大型分布式网站架构技术 1.1 大型网站的特点 用户多&#xff0c;分布广泛 大流量&#xff0c;高并发 海量数据&#xff0c;服务高可用 安全环境恶劣&#xff0c;易受网络攻击 功能多&#xff0c;变更快&#xff0c;频繁发布 从小到大&#xff0c;渐进发展 以用户为中…

基于服务器的个人博客网站搭建

网站搭建 目录 网站搭建 A1 基础 A2 域名 2.1 域名解析 2.2 添加记录 2.2 域名备案 A3 ECS云服务器搭建博客 3.1 安全组添加8888端口 3.2 安装宝塔 3.3 访问网站&#xff0c;登录宝塔 3.4 安装wordpress 3.5 配置wordpress 3.6 进入后台 A4 问题 4.1 关于访问公…

网站备案后没有找到站点

A1 问题&#xff1a; A2 原因&#xff1a; 您没有将此域名或IP绑定到对应站点!配置文件未生效! A3 解决&#xff1a; 检查是否已经绑定到对应站点&#xff0c;若确认已绑定&#xff0c;请尝试重载Web服务&#xff08;大部分是这个问题&#xff0c;添加对应站点和开放端口&am…

linux一键卸载安装脚本,在使用LANMP Linux一键包卸载安装网站服务器要注意的事情...

前言之前在某个论坛里看到了一个关于Nginx如何限制并发的问题&#xff0c;也知道一些朋友也对博客做了一些访问限制(各种什么Js验证、cookie验证&#xff0c;还加了个Fail2ban什么的)然后觉得自己的博客很稳&#xff0c;恩&#xff0c;可能&#xff0c;也许&#xff0c;大概………

个人网站www.pixysoft.net设计系列: 数据库同步的思考

个人网站www.pixysoft.net设计系列: 数据库同步的思考Introduction:本网站使用WebService进行远程网站管理.因此有数据同步的问题表结构设计 说明:网站管理分为本地数据库(如上图设计)和网站数据库. 通过本地数据库管理网站数据库..SiteMapContent保存导航文件.WebPageInfo保存…

使用Web标准建站

使用Web标准建站第1天:选择什么样的DOCTYPE 前言 大家好&#xff01;这个系列文章是按阿捷自己制作这个站点的过程编写的。之前阿捷也一直没有制作过一个真正符合web标准的网站。现在边参考国外资料边制作&#xff0c;同时把过程中的心得和经验记录下来&#xff0c;希望对大家有…

一步一步SharePoint 2007之二十一:解决实现注册用户后,自动具备访问网站的权限的问题(3)——创建用户...

摘要  本篇文章将记录如何解决实现注册用户后&#xff0c;自动具备访问网站的权限的第三部分。   前面各项准备工作都做完了&#xff0c;现在我们就来进行解决实现注册用户后&#xff0c;自动具备访问网站的权限的最后一步设置吧&#xff01;正文  下面将记录每一步的实现…

[电子商务网站设计] 之 Passport

从所承担的功能上来说&#xff0c;Passport 是一个系统级别的服务&#xff0c;而不仅仅用来进行用户管理。对于任何一个网站而言&#xff0c;随着业务的发展&#xff0c;多业务的网站群整合不可避免&#xff0c;那么作为整合的通道之一&#xff0c;用户数据共享自然就是一个关键…

[CSS]30种时尚的CSS网站导航条

【原文地址】&#xff1a;http://coolshell.cn/?p562 我想&#xff0c;大家在上网的时候一定见过很多很多种各式各样的网站导航条的设计。这些导航条基本上来说都是用CSS来做的。这里&#xff0c;我们将向你介绍几种最不错的用CSS设计的网站导航条。希望你会喜欢。 1. The Men…

用python爬取网页内容_用python爬取网页文本内容,让你快速浏览网站内容

大家好&#xff0c;我是咿哑呀。今天我教大家学习网络爬虫&#xff0c;这个爬虫能够爬取网页文本内容&#xff0c;提高大家浏览网页的速度。下面我把代码贴出&#xff0c;大家仔细研究&#xff1a;from urllib import request, parsefrom urllib.parse import quoteimport stri…

python语言的主要网站是_TIOBE:2018年度编程语言 Python八年后重登王座

2003-2018 年度最佳编程语言&#xff1a;可以看到&#xff0c;Python 上一次获得此荣誉&#xff0c;是在 2010 年。 其他值得关注的变化还有&#xff1a; MATLAB —— 从第 18 名升至第 11 名 Kotlin —— 从第 39 名升至第 31 名 Rust —— 从第 46 名升至第 33 名 Julia ——…

网站变成灰色

昨天是4月4日清明节&#xff0c;全国都在为抗击疫情&#xff08;新冠肺炎&#xff09;做斗争牺牲的烈士和逝世的同胞哀悼&#xff0c;各大网站都会让自己的网站的全部网页变成灰色&#xff08;黑白色&#xff09;&#xff0c;以表示我们对逝者的悼念。当然&#xff0c;今天已经…

网站企业信息查询

1. 站长工具 2. 爱站网 3. ICP备案查询 4. 公安备案查询 5. 企业查询 站长工具中的【星网大数据】 全国组织机构统一社会信用代码公示查询平台 爱企查 天眼查

web developer tips (84):在Visual Web Developer中设置web网站的起始页

原文地址&#xff1a;How to set a Start page for your Web Site in Visual Web Developer? 如果你正在开发网站&#xff0c;为了测试网站你想启动某个特定的网页。默认的情况下&#xff0c;当你启动调试的时候&#xff0c;Visual Studio 2008运行的页面是设计器中当前激活的…

ajax nginx 转发 sessionid_教你快速使用nginx部署网站

前言如果服务器只需要放置一个网站程序&#xff0c;解析网站到服务器的网站&#xff0c;网站程序监听80端口就可以了。如果服务器有很多应用&#xff0c;借助nginx不仅可以实现端口的代理&#xff0c;还可以实现负载均衡。本文将详细介绍前端及nodeJS项目在服务器配置时需要用到…

谈谈互动型网站中垃圾贴的应对方案

在互动型网站中常常会受到垃圾贴的困扰。我分享一点个人在垃圾贴处理方面的一点心得&#xff1a; 要处理垃圾贴必然需要分析垃圾贴的特征1. 在内容上垃圾贴通常会带有一个固定域名的外部链接&#xff0c;或者带有QQ号码&#xff0c;手机号码&#xff0c;或者重复内容&#xff1…

python爬虫登录网站_Python爬虫模拟登录带验证码网站

爬取网站时经常会遇到需要登录的问题&#xff0c;这是就需要用到模拟登录的相关方法。python提供了强大的url库&#xff0c;想做到这个并不难。这里以登录学校教务系统为例&#xff0c;做一个简单的例子。 首先得明白cookie的作用&#xff0c;cookie是某些网站为了辨别用户身份…

vue企业网站模板_什么样的模板是高端企业网站模板?

要建立一个高端的企业网站&#xff0c;不管是哪种行业的企业网站&#xff0c;建立高端网站办法就是定制网站了&#xff0c;但除了定制网站&#xff0c;还有一种方法就是&#xff0c;使用高端的企业网站模板建站&#xff0c;通过对网站模板的修改达到建站目的。但是要找到一款高…

php网站绕狗,[WEB]绕过XX狗与300PHP一句话的编写

00x01XX狗的确是让人很头痛&#xff0c;尤其是在上传一句话或者写入一句话的时候&#xff0c;会被XX狗拦截从而拿不下shell。当然&#xff0c;安全狗是最简单的一款waf&#xff0c;很容易就进行一个绕过。00x02对于绕过XX狗跟300&#xff0c;我姿势不多&#xff0c;但是却很实用…

一起谈.NET技术,细数十大免费构建ASP.NET网站必备工具

最近使用ASP.NET为公司构建了一个简单的公共网站(该网站的地址&#xff1a;http://superexpert.com/。在这个过程中&#xff0c;我们使用了数量很多的免费工具&#xff0c;如果把构建ASP.NET网站的必备工具总结一下&#xff0c;将会是一件十分有趣的事情。这些工具既支持ASP.NE…