基于KNN算法的约会网站配对效果 python3.2

news/2024/5/20 22:20:47/文章来源:https://blog.csdn.net/huobanjishijian/article/details/51526083
续前文   Python3.2 实现基于KNN算法的数据分类 。今天看完了《机器学习实战》中关于KNN算法的一个完整案例,将所有代码加了注释,并利用tkinter 将其改造为GUI式的交互界面。(文中没有直接作用的方法我已经注释)
from numpy import *
import operator
import matplotlib
import matplotlib.pyplot as plt
from tkinter import *
from tkinter import messagebox'''
由于本程序中涉及较多的方法,有必要做一下说明
程序正常执行流程:
1、用户输入合法数据,点击“判断一下”按钮
2、窗口获取用户输入值,并以此为参数调用classfifyPerson方法
3、在classfifyPerson方法内部,首先调用file2matrix方法,对训练数据文件进行格式转换
4、然后调用autoNormal方法进行归一化处理
5、调用classify0方法对用户输入值进行分类
6、将结果返回到窗口其它说明:
  含有表单验证,以及退出确认
''''''
作用:将数据文件转换为knn支持的格式
参数:
  filename:保存数据的文件路径
'''
def file2matrix(filename):
  fr=open(filename); #打开存放原始数据的文件
  arrayOfLines=fr.readlines();
  numberOfLines=len(arrayOfLines); #获取文件数据行数
  returnMat=zeros((numberOfLines,3)) ;#创建一个numberOfLines行3列的纯0数组,用于保存格式化的数据
  returnLabel=[] ;# 创建一个空列表,用于保存从数据文件中读取的每一行的分类标签
  index=0;
  for line in arrayOfLines:
    line=line.strip(); #去掉空格
    listFromLine=line.split('\t'); #根据\t进行分隔
    returnMat[index,:]=listFromLine[0:3]; #复制数据    if (listFromLine[-1]=='largeDoses'):
      tempLabel=3;
    elif(listFromLine[-1]=='smallDoses'):
      tempLabel=2;
    elif(listFromLine[-1]=='didntLike'):
      tempLabel=1;
    returnLabel.append(tempLabel); #获取分类标签
    index+=1;
  return returnMat,returnLabel;'''
作用:将待分类数据集与已有数据集以其标签进行计算,从而得出待分类数据集最有可能所属的类别
参数:
  inX:待分类数据集
  dataSet:已有数据集,通过createDataSet()函数获取
  labels:已有数据集对应的分类标签,通过createDataSet()函数获取
  k:设置最小距离数
'''	
def classify0(inX, dataSet, labels, k):
  dataSetSize = dataSet.shape[0] #获取数据集的行数  #计算距离
  #tile(a,(b,c)):将a的内容在行上重复b次,列上重复c次
  #下面这一行代码的结果是将待分类数据集扩展到与已有数据集同样的规模,然后再与已有数据集作差
  diffMat = tile(inX, (dataSetSize,1)) - dataSet   sqDiffMat = diffMat**2  #对上述差值求平方   
  sqDistances = sqDiffMat.sum(axis=1) #对于每一行数据求和
  distances = sqDistances**0.5 #对上述结果开方
  sortedDistIndicies = distances.argsort()  #对开方结果建立索引   #计算距离最小的k个点的Lable
  classCount={}  #建立空字典,类别字典,保存各类别的数目
  for i in range(k): #通过循环寻找k个近邻
    voteIlabel = labels[sortedDistIndicies[i]] #先找出开方结果索引表中第i个值对应的Label值
    classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 # 存入当前label以及对应的类别值  sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) #对类别字典进行逆排序,级别数目多的往前放  #返回结果
  return sortedClassCount[0][0] #返回级别字典中的第一个值,也就是最有可能的Label值'''
作用:根据数据生成图
参数:
  x、y:为数据区域
  l:为标签区域
'''
# def showPlot(x,y,l):
#	 fig=plt.figure();
#	 #plt.scatter(mat[:,1],mat[:,2])
#	 ax=fig.add_subplot(1,1,1);
#	 ax.scatter(x,y,15.0*array(l),15.0*array(l));
#	 plt.show();'''
作用:数据归一化
参数:dataSet:数据集
'''
def autoNormal(dataSet):
  minVal=dataSet.min(0); #求得每一列最小值
  maxVal=dataSet.max(0); #求得每一列最大值
  ranger=maxVal-minVal; # 两者做差,得到差值矩阵
  normalDataSet=zeros(shape(dataSet)); #创建一个与dataSet规模相同的纯0矩阵
  m=dataSet.shape[0]; #获取DateSet的数据行数
  normalDataSet=dataSet-tile(minVal,(m,1)); #将最小值矩阵扩展到m行,1列,再用DataSet去做差,结果存入normalDataSet中
  normalDataSet=normalDataSet/tile(ranger,(m,1)); #将最大值矩阵扩展到m行,1列,再用normalDataSet去除以差值矩阵,得到最终结果
  return normalDataSet,ranger,minVal;'''
作用:从归一化数据集中抽出前100条做为测试数据,交给分类器分类,计算分类效果
'''
# def test():
#	 hoRatio=0.1; #设置测试集在整体数据集中的比例
#	 mat,lab=file2matrix('datingTestSet.txt'); #文件格式转换
#	 normMat,ranges,minValues=autoNormal(mat); # 数据归一化
#	 m=normMat.shape[0]; # 获取数据行数
#	 numTestVecs=int(m*hoRatio); #获取测试数据行数,即1000*0.1=100
#	 errorCount=0.0; # 设置错误计数器
#	 for i in range(numTestVecs): # 遍历前100行数据,交给分类器进行分类,并计算错误率
#		 classifierResult=classify0(normMat[i,:],normMat[numTestVecs:m,:],lab[numTestVecs:m],3); # 将当前第i条数据交给分类器进行分类
#		 print('ML结果:',classifierResult,',实际结果:',lab[i]); # 显示当前行数据的分类结果
#		 if(classifierResult!=lab[i]): # 如果出错,错误计数器加1
#			 errorCount+=1.0;
#	 print('错误率:',(classifierResult/float(numTestVecs))*100,"%"); # 显示最终结果'''
作用:用户输入一组信息,程序对其进行分类测试
'''
def classfifyPerson(flight,game,cream):
  resultList=['屌丝','文艺青年','高富帅'];
  
  flight=float(flight);
  game=float(game);
  cream=float(cream);  mat,lab=file2matrix('datingTestSet.txt');
  norMat,ranges,minVal=autoNormal(mat);
  arrays=array([flight,cream,game]);
  claResult=classify0((arrays-minVal)/ranges,norMat,lab,3);  # print('你的相亲极97%的可能性为:',resultList[claResult-1]);
  return '老夫掐指一算,该人为:'+resultList[claResult-1]#生成窗口
root=Tk();
root.title('相亲对象预测系统');'''
作用:窗口居中方法,由于tkinter自身没有直接设置窗口居中的方法,只能来手工计算了.这也一个通用的窗口居中方法
参数:
  obj:为窗口对象
  w:为窗口宽度
  h:为窗口高度
'''
def center_window(obj,w, h):
  # get screen width and height
  ws = obj.winfo_screenwidth()
  hs = obj.winfo_screenheight()
  # calculate position x, y
  x = (ws/2) - (w/2)   
  y = (hs/2) - (h/2)
  obj.geometry('%dx%d+%d+%d' % (w, h, x, y))center_window(root,400, 300) #设置窗口控件对应的变量类型及初始值
txtFlight=StringVar();
txtFlight.set('');
txtGame=StringVar();
txtGame.set('');
txtEat=StringVar();
txtEat.set('');
txtResult=StringVar();
txtResult.set('');'''
作用:单击事件执行的方法,获取用户值,交给分类器,在Label中显示结果。
其中try块的作用检测用户输入值的合法性
'''
def submit(): 
  try:
    getFlight=float(txtFlight.get());
    getGame=float(txtGame.get());
    getEat=float(txtEat.get());
    resultStr=classfifyPerson(getFlight,getGame,getEat); # 获取用户输入值并调用分类方法
    txtResult.set(resultStr) ; # 在Label中显示结果
  except(Exception):
     messagebox.showwarning("警告", "每项值都不为空,且只能为实型!") ;def closeWin(): #退出按钮事件
  result=messagebox.askokcancel(title='确认',message='确定要退出么亲?'); # 弹出确认窗口,捕获用户选择
  if(result==True): # 如果用户选择是,则退出程序
    root.destroy();'''
生成各控件
控件布局采用grid方式;
row和column指定控件在grid中的位置;
pady设定控件与其它控件之间在y方向上的距离(类似于CSS中的margin属性);
columnspan设定水平方向上合并的grid数,类似于excel或word中的水平合并单元格,html的table中也有这个属性
sticky设置控件在grid中的位置,可选值有e,s,w,n,ne,nw,se,sw,其实对应的是四面八方或上下左右等8个位置,默认为center,居中'''
labelFligt=Label(root,text='飞行里程:',font=("微软雅黑",14),fg="blue");
labelFligt.grid(row=0,column=0,pady=10);
inputFlight=Entry(root,textvariable=txtFlight,font=("微软雅黑",14),fg="blue");
inputFlight.grid(row=0,column=1,pady=10);labelGame=Label(root,text='游戏时间:',font=("微软雅黑",14),fg="blue");
labelGame.grid(row=1,column=0,pady=10);
inputGame=Entry(root,textvariable=txtGame,font=("微软雅黑",14),fg="blue");
inputGame.grid(row=1,column=1,pady=10);labelEat=Label(root,text='吃货程度:',font=("微软雅黑",14),fg="blue");
labelEat.grid(row=2,column=0,pady=10);
inputEat=Entry(root,textvariable=txtEat,font=("微软雅黑",14),fg="blue");
inputEat.grid(row=2,column=1,pady=10);submitBtn=Button(root,text='判断一下',command=submit); # 绑定事件
submitBtn.grid(row=3,column=0,pady=10);labelResult=Label(root,text='',textvariable=txtResult,font=("微软雅黑",14),fg="red");
labelResult.grid(row=4,column=0,columnspan=2,pady=10,sticky='e');closeBtn=Button(root,text='关 闭',command=closeWin);
closeBtn.grid(row=5,column=2);root.mainloop();

效果图:


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

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

相关文章

app和wap手机网站的区别在那里

app在大行其道的情况下,本人来发表关于app和手机wap网站的几个观点,希望对各位同仁有参考价值: 第一点 我们从依附的平台来看: 移动Wap网站:由移动设备的浏览器来支持,只要移动设备支持上网浏览网站基本上可…

Java Web学习十七:网站用户注册登录;预约信息

Java Web学习十七:网站用户注册&登录;预约信息 一:案例任务二:准备阶段三:代码分析与展示1.工具类的代码分析:2.注册功能代码分析 刚刚学习初期,我们写了网站用户的注册以及登录功能&#x…

黄阶中级-《大型网站技术架构》- 概述 - 修改0次

1、大型网站架构演化 互联网站的发展仅仅经历了 20 多年的时间。 大型网站软件系统的特点: 高并发、高流量。谷歌日均 PV 几十亿。 PV (访问量):即 Page View , 即页面浏览量或点击量,用户每次刷新即被计算一次高可用。百度被黑就会成为热…

GCP搭建网站后403解决

由于开发需要,在本地用虚拟机配置了LNMP环境,使用的是Centos 6.8的yum安装,安装一切正常,但是使用默认的网站配置目录,是在/usr/share/nginx/html这个目录下。简直是有点奇葩了。 于是乎,我先将默认的配置…

【iPhone】网络编程–一起来做网站客户端(一)

http://www.pan-apps.com/?p281 最近几天,一直在学习网络编程方面,我觉得这是移动开发必须了解的知识吧 在实践中学习,才是最好的方法 于是就决定为公司OA系统做一个iphone客户端,但是前提是这个系统没有提供任何API,所以只能悲剧…

编程要趁早 BI推荐8个编程学习网站

http://www.cocoachina.com/applenews/devnews/2013/0329/5914.html 最近一个热门话题是雅虎以3000万美元收购了移动阅读应用Summly,真正让人吃惊的不是3000万美元的价格值不值,而是Summly的开发者--只有17岁的尼克达洛伊西奥。他12岁开始学习编程&#…

自动为 Gatsby网站中的 Markdown 页面添加 sidebar

0 简介 我想在Gatsby网站上创建Markdown页面时自动添加侧边栏。 有一个 starter “ gatsby-gitbook-starter” 可以支持markdown文件的侧边栏,但仅支持1级。 我希望能够支持更多级别。 你可以通过下面的命令安装这个starter。 gatsby new gatsby-gitbook-starter…

如何在标题栏title前添加网站logo?

第一种方法&#xff1a;据说在网站根目录下放着我们的ico型logo&#xff0c;命名为favicon.ico&#xff0c;浏览器会自动去找到并显示。试了试&#xff0c;在firefox23和ie8下都没有成功。 第二种方法&#xff1a;添加代码&#xff0c;如下&#xff1a; 1 <link rel"sh…

阿里云域名解析完成后仍然无法通过域名正常访问网站

通过阿里云进行域名解析后&#xff0c;仍然无法正常访问网站的解释&#xff0c;与解决办法 1、域名解析完成后&#xff0c;未在主机管理页面进行域名绑定。 域名绑定流程&#xff1a; 进入阿里云虚拟主机页面&#xff0c;找到相应的虚拟主机&#xff0c;点击后面的管理。 点击…

web页面性能优化以及SEO

前言&#xff1a; 在同样的网络环境下&#xff0c;两个同样能满足你的需求的网站&#xff0c;一个“Duang”的一下就加载出来了&#xff0c;一个纠结了半天才出来&#xff0c;你会选择哪个&#xff1f;研究表明&#xff1a;用户最满意的打开网页时间是2-5秒&#xff0c;如果等…

wordpress建站优化技巧

wordpress是一款开源的PHP博客程序&#xff0c;可以有大量的开源主题与插件&#xff0c;使用液非常简单&#xff0c;wordpress在全球范围应用都十分广泛&#xff0c;根据Pingdom.com最近发布的一份数据&#xff0c;2013年在Technorati排名前100的博客&#xff08;Technorati为一…

个人网站添加百度统计

网站如何添加百度统计&#xff1f; 上线网站后&#xff0c;需要进行网站的维护和及时观察网站的流量等方面去了解自己的网站&#xff0c;百度统计工具可以查看多少访客访问了网站&#xff0c;以及分析流量来源等情况。那应该如何为网站添加百度统计工具呢&#xff1f; 1、注册…

[转]50个c/c++源代码网站

[转]50个c/c源代码网站 Posted on 2010-03-05 14:59 feisky 阅读(1182) 评论(2) 编辑 收藏 所属分类: C/C C/C是最主要的编程语言。这里列出了50名优秀网站和网页清单&#xff0c;这些网站提供c/c源代码 。这份清单提供了源代码的链接以及它们的小说明。我已尽力包括最佳的C/C…

32个不应该做的JOOMLA SEO优化手法

32个不应该做的JOOMLA SEO优化手法 隐藏元件的方式有很多&#xff0c;這也是最常被誤用的SEO手法&#xff0c;但也是Google抓最兇的部分&#xff0c;所以你要避免&#xff1a; 1. 在白背景上使用白色文字 2. 藏字在圖的下方 3. 利用CSS隐藏文字 4. 用小字來建立鏈接以及增加…

Win7部署asp.net网站问题---HTTP 错误 500.0 - Internal Server Error 调用 LoadLibraryEx 失败...

在IIS上部署网站时遇到这样一个问题&#xff1a;“ HTTP 错误 500.0 - Internal Server Error调用 LoadLibraryEx 失败&#xff0c;在 ISAPI 筛选器 "C:\Program Files (x86)\Sybase\PowerDynamo\win32\dyisa03.dll" 上”。 具体的问题展示如图&#xff1a; 通过网络…

高效在线抠图网站

介绍几款高效的抠图网站&#xff0c;给那些不想动手的。 1、怪兽抠图 链接: https://818ps.com/koutu/ 这是一个国内的站点&#xff0c;抠图后的图片不需要登录就能下载。 点击 上传图片 上传你需要抠图的素材。 用蓝色画出想保留的区域 用红色画出想要抠除的区域 - 简单…

VS2013 发布网站时文件丢失解决办法

网站发布时&#xff0c;发现一些模板文件没有复制到文件夹中解决办法&#xff1a;选择文件打开属性窗口找到生成操作&#xff0c;选项选择“内容”&#xff0c;然后重新发布 转载于:https://www.cnblogs.com/linyongqin/articles/6393166.html

常用网站链接

IEEE802标准下载 Browse Standards | Get Program | IEEE Xplorehttps://ieeexplore.ieee.org/browse/standards/get-program/page/series?id68

WordPress使用七牛CDN加速网站教程

七牛是一个著名的云加速公司&#xff0c;国内很多大网站都在使用&#xff0c;而且对新用户会有不少的免费额度&#xff0c;如果网站不是很大的话完全够用。 今天waitig就给大家介绍一下如何使用七牛来给WordPress加速。 注册 首先去七牛注册一个账号&#xff0c;可以直接点此注…

网站进行SEO优化时如何做好布局内链?

5月12日SEO经验 昨日和杭州西湖区某企业SEO总监谈我们在优化中如何让蜘蛛有效抓取,谈到中到底站内链接布局有多重要?想必每一个专业的网站优化人员都知道,网站的每一个页面就像一张蜘蛛网一样,良好的站内链接能很好的吸引蜘蛛抓取,而且网站内链做的好,在一定程度上是可以取代外…