第一周:KNN算法求解约会网站问题

news/2024/5/15 3:49:50/文章来源:https://blog.csdn.net/weixin_43618989/article/details/104596551

1.KNN算法简介

K近邻法(k-nearest neighbors, KNN)是一种很基本的机器学习方法了,在我们平常的生活中也会不自主的应用。比如,我们判断一个人的人品,只需要观察他来往最密切的几个人的人品好坏就可以得出了,这里就运用了KNN的思想。KNN方法既可以做分类,也可以做回归。

2.KNN流程框图

在建立训练集时,就要确定训练数据及其对应的类别标签;然后把待分类的测试数据与训练集数据依次进行特征比较;从训练集中挑选出最相近的k个数据,这k个数据中投票最多的分类,即为新样本的类别。
在这里插入图片描述

3.问题描述

在这里插入图片描述

4.KNN代码

from numpy import * 
import operator
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn import datasets
import seaborn as sns
from sklearn.metrics import accuracy_score,f1_score, precision_score, recall_scoredef file2matrix(filename):fr = open(filename)arrayOLines = fr.readlines()numberOfLines = len(arrayOLines) returnMat = zeros((numberOfLines,3))classLabelVector = []index = 0for line in arrayOLines: listFromLine = line.strip().split('\t')returnMat[index,:] = listFromLine[0:3] classLabelVector.append(int(listFromLine[-1]))index += 1return returnMat,classLabelVector#datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')
#print(datingDataMat)
#print(datingLabels[0:10])
def corCoefficient():datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')for i in range(3):a = datingDataMat[:,i]b = corrcoef(a,datingLabels)print("第%d个特征与输出的相关系数:"%(i+1),b[0][1])c = corrcoef(datingDataMat,rowvar=0)print(c[0][1],c[0][2],c[1][2])plt.figure(figsize=(5,5))sns.heatmap(c,annot=True)fig = plt.figure()ax1 = fig.add_subplot(111)plt.xlabel("Miles")plt.ylabel("Time")ax1.scatter(datingDataMat[:,0],datingDataMat[:,1],s = [15],c = array(datingLabels))plt.show()def autoNorm(dataSet):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))return normDataSet,minVals,ranges#normMat,minVals,ranges = autoNorm(datingDataMat)
#print(normMat)
#print(minVals)
#print(ranges)
#print('------------------------------------------')def classify(inX,dataSet,labels,k):dataSetSize = dataSet.shape[0]diffMat = tile(inX,(dataSetSize,1)) - dataSetsqDiffMat = diffMat**2  sqDistances = sqDiffMat.sum(axis=1)distances = sqDistances**0.5 sortedDistIndicies = distances.argsort()classCount={} for i in range(k): voteIlabel = labels[sortedDistIndicies[i]]classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)return sortedClassCount[0][0]def datingClassVolidate():
#得到最佳k=5datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')normMat,minVals,ranges = autoNorm(datingDataMat) X_train,X_test,y_train,y_test=train_test_split(normMat,datingLabels,
test_size=0.2,random_state=2)#print ("train:",len(X_train), "test:",len(X_test))folds = 5k_choices = [1,3,5,7,9,11,13,15,17,19,21,23,25]#k_choices = [1,3,5,7,9,13,15,20,25]X_folds = []y_folds = []X_folds = vsplit(X_train,folds)y_folds = hsplit(array(y_train),folds)accuracy_of_k = {}for k in k_choices:accuracy_of_k[k] = []for i in range(folds):X_train = vstack(X_folds[:i] + X_folds[i+1:]) X_val = X_folds[i]y_train = hstack(y_folds[:i] + y_folds[i+1:])y_val = y_folds[i]#print (X_train.shape,X_val.shape,y_train.shape,y_val.shape)#print(y_val)for k in k_choices:accuracyCount = 0.0for i in range(X_val.shape[0]):y_val_pred = classify(X_val[i,:],X_train,y_train,k)if(y_val_pred == y_val[i]):accuracyCount += 1.0#print("the total error rate is: %f,k =" %(errorCount/float(numVoVecs)),k)accuracy_of_k[k].append(accuracyCount/float(X_val.shape[0]))#for k in sorted(k_choices):#for accuracy in accuracy_of_k[k]:#print ('k = %d,准确率 = %f' %(k,accuracy))   print('-------------------------')a = {}for k in k_choices:a[k] = []for k,v in accuracy_of_k.items():a[k].append(mean(v))print('k = %d,平均准确率:%f'%(k,mean(v)))b = sorted(a.items(),key=operator.itemgetter(1),reverse=True)print('最大准确率%f时,k = %d'%(b[0][1][0],b[0][0]))for k in k_choices:plt.scatter([k]*len(accuracy_of_k[k]), accuracy_of_k[k])accuracies_mean = array([mean(v) for k,v in accuracy_of_k.items()])accuracies_std = array([std(v) for k,v in accuracy_of_k.items()])plt.errorbar(k_choices, accuracies_mean, yerr=accuracies_std)plt.title('cross volidate on K')plt.xlabel('K')plt.ylabel('cross-volidate accuracy')plt.show()def datingClassTest():datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')normMat,minVals,ranges = autoNorm(datingDataMat) X_train,X_test,y_train,y_test = train_test_split(normMat,datingLabels,test_size=0.2,random_state=2)errorCount = 0.0classifylist = []for i in range(X_test.shape[0]):classifierResult = classify(X_test[i,:],X_train,y_train,5)classifylist.append(classifierResult)#print("the classifier came back with: %d, the real answer is: %d" %(classifierResult,datingLabels[i]))if(classifierResult != y_test[i]):errorCount += 1.0print("准确率: %f," %(1-errorCount/float(X_test.shape[0])))#print(classifylist)#accuracy_s = accuracy_score(y_test, classifylist)precision_s = precision_score(y_test, classifylist,average='macro')  # 精确度recall_s = recall_score(y_test, classifylist,average='macro')  # 召回率f1_s = f1_score(y_test, classifylist,average='macro')  # F1得分#print(accuracy_s)print("精确度: %f," %precision_s)print("召回率: %f," %recall_s)print("F1得分: %f," %f1_s)def classifyPerson():resultList = ['不喜欢的人','魅力一般的人','极具魅力的人']Miles = float(input("每年的飞行里程数:"))Time = float(input("玩游戏时间:"))IceCream = float(input("冰淇淋消耗量:"))datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')normMat,minVals,ranges = autoNorm(datingDataMat)inArr = array([Miles,Time,IceCream])classifierResult = classify((inArr-minVals)/ranges,normMat,datingLabels,5)print("你对这个人的喜欢程度:",resultList[classifierResult - 1])if __name__ == '__main__':corCoefficient()datingClassVolidate()datingClassTest()classifyPerson()

5.结果展示

5.1 数据预处理

由于是标准数据,所以在数据导入后直接对数据进行分析,得到以下结果:
第1个特征与标签的相关系数: -0.4118504507209078
第2个特征与标签的相关系数: 0.3430459507835666
第3个特征与标签的相关系数: 0.025614191377917542
可以看出,第1,2特征对分类结果较为重要,由于特征仅有3个就全部使用进行训练模型,其次分析特征之间的相关性,得到下图:
在这里插入图片描述
通过观察数据,看到各个特征之间数值差距较大,所以先对其进行归一化处理,再进行之后的训练,可见代码(def autoNorm(dataSet): )部分

5.2 模型训练

首先将数据随机分成80%训练集,20%测试集,使之后能够验证模型的准确率
其次在80%训练集中进行交叉验证,采用的是k=5的交叉验证法,来对KNN中的k值进行验证,得到一个较好的k值,如下图:
在这里插入图片描述

5.3 模型测试

用之前得到的20%的测试集进行测试,通过对准确率,精确率,召回率,F1值分析来测试该模型好坏,得到以下值:
在这里插入图片描述

5.4 分类预测

通过运行程序可以进行预测,如输入数据(44000,12,0.5),预测结果是"极具魅力的人"
在这里插入图片描述

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

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

相关文章

用python监控女朋友的网站看你女朋友每天都在看一些什么东西

需求 (1)你要有个女朋友(没有也行问题不大) (2)获取你女朋友chrome前一天浏览记录中的所有网站路径和访问时间,把它保存到一个txt中 (3)将这个txt文件发送给指定的邮箱…

还在手写代码?用了这个工具,不用一行代码也能做出网站

制作网站用什么,Dreamweaver 还是Fireworks? 现在,用 GPT-3 就可以。 一位来自旧金山的程序员小哥做了款名为 debuild.co 的网页制作软件,只需要和 GPT-3“聊聊天”,它就能帮你把网站设计出来。 例如,想要…

你知道这些关于大数据与数据分析的学习网站吗?

一.数据分析 1.数据分析网 网址:www.afenxi.com 主要内容包括:大数据相关的最新的资讯、业内人物的点评文章、数据分析相关的技术文章、大量的数据分析的相关免费的学习资源以及相关的线下线上活动。 其中,网站的技术文章主要包括 大数据&am…

影响网站运营的决定性因素

很多人都以为网站运营就是每天发发文章、发发外链、查看一下数据。非也非也,真正意义上的网站运营绝不止这些机械性的工作,而是更大层面上面的统筹的一个工作,是一个需要考虑很多因素的、变数很大的工作。大到网站框架的搭建、小到最初域名的…

浅谈:定制网站如何防止被套路

各个企业都有做公司网站的需要,基本上一般微型企业是自己公司养不起IT的,并且做网站是个细活,需要策划、美工、前端、后台程序、售后等多个岗位共同完成,因此很多公司定制企业网站都是选择网站外包出去,找专业的网建公…

网站存在过度优化,如何避免?

企业网站优化是指通过对网站功能、网站结构、网页布局、网站内容等要素的合理设计,使得网站内容和功能表现形式达到对用户友好并易于宣传推广的最佳效果,充分发挥网站的 网络营销 价值,是一项系统性和全局性的工作,包括对用户的优…

那些年门户网站开发应该遵循的原则

网站不是为了赶一时的潮流或是博取一个好名声,而是要通过互联网这个全球性的网络来宣传企业、开拓市场,同时,降低企业的 管理成本 、交易成本和售后服务成本,并通过开展一系列的电子商务活动获得更多的利润,这些均与企…

浅谈:模板网站能否满足当前企业网站建设的需要?

网站并不是一个新名词,它已在许多公司使用。网站的目的是向人们提供他们需要的信息,使他们愿意访问,网站将有其真正的意义。但是太多的网站显然忘记了这个目的。复杂的创作技能跃升到了主导地位,内容信息也落到了最后。 我们也知道…

企业网站建设是否真的对企业有价值?

在当今这个互联网的时代,如果还认为网站建设对企业没有价值,那么对您企业的未来发展表示担忧。相信在这个时代,无论哪一个行业,都在遭受网络销售渠道的冲击,只是受到的影响大小不同而已。网站建设不过是为以后的网络营…

tomcat部署静态html网站方法

一、首先下载tomcat(apache-tomcat-8.5.6) 二、将静态html页面以及相关文件放在一个目录,如A目录 三、将A目录放在..:\apache-tomcat-8.5.6\webapps目录下 四、指定tomcat访问端口号(在如图所示目录下找到server.xml文件并打开…

搭建自己的互联网网站

一、关于内网服务器的搭建,可参考我的k8s持续集成,现在我们要把这些服务或者这些网站暴露到公网。 1、首先需要购买一个域名(购买途径:腾讯云,阿里云,或者知名的域名管理机构),本人购…

【翻译】你不知道的优化网站速度的方法

作者 | Kayce Basques 来源 | Tools for Web Developers 链接 | Optimize Website Speed With Chrome DevTools 目标 本教程教您如何使用Chrome DevTools,以便找到让网站加载速度更快的方法。 继续阅读或者可以观看本教程的视频版本: 前提条件 您应该具有…

神奇的网站安全狗,我的网站守护神!

我的网站一天一天的发展,流量不断的壮大,但随之而来的安全问题也是层出不穷,各种木马病毒日益猖獗,挂马网站的数量也增长迅速,原本服务器的安全软件科摩多,早就已经不堪重用。我不断在搜索更好的网站WINIIS…

(转)优秀网站源码、编程源码下载网站大集中

http://blog.csdn.net/chenmeimei_8899/archive/2008/05/11/2432580.aspx 源代码网站 收藏 优秀网站源码、编程源码下载网站大集中 1.51源码: http://www.51aspx.com/ 2.源码之家: http://www.codejia.com/ 3.源码网: http://www.codepub.com…

整理-常用招聘网站

给你们整理了目前常用的招聘平台,少废话,如下: 前程无忧(51job) 前程无忧人才网面向全国,提供2018最新最全最准确的招聘网站信息,为企业和求职者提供人才招聘、求职、找工作、培训等在内的全方位的人力资源服务,更多求…

就是玩儿第一弹——用github创建自己的网站

碎碎念 这个真的是不务正业啦但是就是想皮一下 纪念一下自己创建的第一个网站😜 不知道能不能克服懒癌定时更新啊哈哈哈哈~但是好有成就感~视频的话,主要是学起来比较直观,但是肯定是远远不够~建议先看视频再看博客,遇到BUG多多百…

Django模板调用session值在前端显示以及比较实用的前端代码网站

Django模板调用session值在前端显示 解决方法&#xff0c;在前端html中如下使用 {{request.session.homepageuser.uname }}HTML代码&#xff1a; <img class"img-avatar img-avatar-48 m-r-10" src"{{request.session.homepageuser.avatar_path}}" al…

从12.67s到1.06s的网站性能优化实战

作者&#xff1a;jerryOnlyZRJ https://juejin.im/post/5b6fa8c86fb9a0099910ac91 本文是对之前同名文章的修正&#xff0c;将所有webpack3的内容更新为webpack4&#xff0c;以及加入了笔者近期在公司工作中学习到的自动化思想&#xff0c;对文章内容作了进一步提升。 原文链接…

分享五个404页面模板 超好看的404页面你的网站离不了 seo优化404

一个完整的网站离不开一个好的404页面&#xff0c;404页面不光是让你的网站美观&#xff0c;它对SEO的作用也很大&#xff0c;你想一下如果用户打开你的网站&#xff0c;输入一个不存在的风址&#xff0c;如果没有404直接就报错了&#xff0c;有了404就能打开一个美观的页面&am…

如何自学PHP做一个网站 PHP可以做什么项目?网站 小程序 公众号能用PHP开发吗?

很多想从事程序开发的人员&#xff0c;想自学一门语言&#xff0c;不知道从哪里下手学习&#xff0c;如何入门学习&#xff1f;今天我们就以PHP为例子&#xff0c;来讲述一下如何快速的学习一门开发语言&#xff0c;让你快速入门。PHP是一个什么语言&#xff1f;它能开发什么项…