机器学习实战—k近邻算法(kNN)02-改进约会网站的配对效果

news/2024/5/10 1:36:58/文章来源:https://blog.csdn.net/u012150360/article/details/71276606

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

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

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

kNN.py中创建名为file2matrix的函数,以此来处理输入格式问题。该函数的输入为文件名字符串输出为训练样本矩阵和类标签向量

# 将文本记录转换为NumPy的解析程序
def file2matrix(filename):fr = open(filename)#得到文件行数arrayOfLines = fr.readlines()numberOfLines = len(arrayOfLines)#创建返回的Numpy矩阵returnMat = zeros((numberOfLines,3))classLabelVector = []#解析文件数据到列表index = 0for line in arrayOfLines:line = line.strip() #注释1listFromLine = line.split('\t') #注释2returnMat[index,:] = listFromLine[0:3]classLabelVector.append(int(listFromLine[-1]))index +=1return returnMat,classLabelVector

注释:
1. Python strip() 方法用于移除字符串头尾指定的字符(默认为空格)
2. .split(‘\t’) 按照制表符切割字符串
split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串
语法:
str.split(str=”“, num=string.count(str))

  • str – 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
  • num – 分割次数。

在终端输入:

In[13]: reload(kNN)  #之前必须先import过,不然会报错
Out[13]: 
<module 'kNN' from '/home/vickyleexy/PycharmProjects/handwriting_KNN/kNN.py'>
In[14]: datingDataMat,datingLabels = kNN.file2matrix('datingTestSet.txt')
In[15]: datingDataMat
Out[15]: array([[  4.09200000e+04,   8.32697600e+00,   9.53952000e-01],[  1.44880000e+04,   7.15346900e+00,   1.67390400e+00],[  2.60520000e+04,   1.44187100e+00,   8.05124000e-01],..., [  2.65750000e+04,   1.06501020e+01,   8.66627000e-01],[  4.81110000e+04,   9.13452800e+00,   7.28045000e-01],[  4.37570000e+04,   7.88260100e+00,   1.33244600e+00]])
In[16]: datingLabels[0:20]
Out[16]: 
[3, 2, 1, 1, 1, 1, 3, 3, 1, 3, 1, 1, 2, 1, 1, 1, 1, 1, 2, 3]       
  • 在Python中,想要使用模块,例如numpy,要先用import numpy as np导入,但调用其中的方法的时候,例如要使用zeros创建零矩阵,要用np.zeros(),有时候这样感觉有些麻烦,可以直接from numpy import * ,这样调用方法的时候直接使用zeros()即可。

分析数据:使用Matplotlib创建散点图

在终端输入:

In[17]: import matplotlib
In[18]: import matplotlib.pyplot as plt
In[19]: zhfont = matplotlib.font_manager.FontProperties(fname='/usr/share/fonts/truetype/arphic/simsun.ttc')
In[19]: fig = plt.figure()   #创建新窗口
In[20]: ax = fig.add_subplot(111) #将画布分割成1行1列,图像画在从左到右从上到下的第1块
In[22]: ax.scatter(datingDataMat[:,1],datingDataMat[:,2]) # 散点图函数(横坐标数据,纵坐标数据)
Out[22]: 
<matplotlib.collections.PathCollection at 0x7fcbaf70a550>
In[23]: plt.xlabel(u'每年获取的飞行常客历程数',fontproperties=zhfont)
Out[23]: 
<matplotlib.text.Text at 0x7fcbadfc6b50>
In[24]: plt.ylabel(u'玩游戏所耗时间百分比',fontproperties=zhfont)
Out[24]: 
<matplotlib.text.Text at 0x7fcbaddc0950>

这里写图片描述

由于上图没有使用样本分类的特征值,我们很难从图中看出任何有用的数据模式信息。
以下改进:
在终端输入:

In[27]:from numpy import *
In[29]: ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*array(datingLabels),15.0*array(datingLabels))
Out[29]: 
<matplotlib.collections.PathCollection at 0x7fcbb2662e90>
plt.xlabel(u'每年获取的飞行常客历程数',fontproperties=font)

这里写图片描述

以下采用列1和列2的属性值却可以得到更好的效果:
另创建文件matplotlib_pic.py

# _*_ coding: utf-8 _*_
import kNN
reload(kNN)
import matplotlib
import matplotlib.pyplot as plt
datingDataMat, datingLabels = kNN.file2matrix('datingTestSet.txt')
print datingDataMat
print datingLabels
zhfont = matplotlib.font_manager.FontProperties(fname='/usr/share/fonts/truetype/arphic/uming.ttc')
plt.figure(figsize=(8, 5), dpi=80)
axes = plt.subplot(111)
# 将三类数据分别取出来
# x轴代表飞行的里程数
# y轴代表玩视频游戏的百分比
type1_x = []
type1_y = []
type2_x = []
type2_y = []
type3_x = []
type3_y = []
print 'range(len(datingLabels)):'
print range(len(datingLabels))
for i in range(len(datingLabels)):if datingLabels[i] == 1:  # 不喜欢type1_x.append(datingDataMat[i][0])type1_y.append(datingDataMat[i][1])if datingLabels[i] == 2:  # 魅力一般type2_x.append(datingDataMat[i][0])type2_y.append(datingDataMat[i][1])if datingLabels[i] == 3:  # 极具魅力print i, ':', datingLabels[i], ':', type(datingLabels[i])type3_x.append(datingDataMat[i][0])type3_y.append(datingDataMat[i][1])type1 = axes.scatter(type1_x, type1_y, s=20, c='red')
type2 = axes.scatter(type2_x, type2_y, s=40, c='green')
type3 = axes.scatter(type3_x, type3_y, s=50, c='blue')
# plt.scatter(matrix[:, 0], matrix[:, 1], s=20 * numpy.array(labels),
#c=50 * numpy.array(labels), marker='o',label='test')
plt.xlabel(u'每年获取的飞行里程数', fontproperties=zhfont)
plt.ylabel(u'玩视频游戏所消耗的事件百分比', fontproperties=zhfont)
axes.legend((type1, type2, type3), (u'不喜欢', u'魅力一般', u'极具魅力'), loc=2, prop=zhfont)
plt.show()

这里写图片描述
- 字体下载:http://download.csdn.net/detail/u012150360/9835424
- 或:http://download.csdn.net/detail/u012150360/9835396

准备数据:归一化数值

由于‘每年获得的飞行常客里程数’对计算结果的影响远大于其他两个特征对计算结果的影响,特别是以距离作为计算标准的时候,所以要将数据进行归一化处理,统一将初始的数据的取值范围转化为0到1区间内的值(其他范围比如-1到1内也是可以的),如此才能使得它们的权重是相等的。

以下公式可以将任意取值范围的特征值转化为0到1区间的值。
newValue = (oldValue - min)/(max - min)

在文件kNN.py中增加一个新函数autoNorm(),该函数可以自动将数字特征值转化为0到1的区间。

# 归一化特征值
def autoNorm(dataSet):minVals = dataSet.min(0) #注释1maxVals = dataSet.max(0)ranges = maxVals - minVals #是一个一行3列的数组normDataSet = zeros(shape(dataSet)) #创建一个与dataSet同大小的零矩阵m = dataSet.shape[0]           #数据行数normDataSet = dataSet - tile(minVals,(m,1)) #tile()函数将变量内容复制成输入矩阵同等的大小,注释2#特征值相除normDataSet = normDataSet/tile(ranges,(m,1))return normDataSet,ranges,minVals

注释:
1..min(0)中的参数0,使得函数可以从每列中选取最小值。输出结果:
In[107]: minVals
Out[107]:
array([ 0. , 0. , 0.001156])
若.min(1)应该是从每行中选取最小值。
2. tile(minVals,(m,1))
tile函数是将minVals在行上复制m次,在列上复制1次。

在终端输入,以测试autoNorm函数:

In[123]: reload(kNN)
Out[123]: 
<module 'kNN' from '/home/vickyleexy/PycharmProjects/handwriting_KNN/kNN.py'>
In[124]: normMat,ranges,minVals = kNN.autoNorm(datingDataMat)
In[125]: normMat
Out[125]: 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]])
In[126]: ranges
Out[126]: 
array([  9.12730000e+04,   2.09193490e+01,   1.69436100e+00])
In[127]: minVals
Out[127]: 
array([ 0.      ,  0.      ,  0.001156])

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

  机器学习一个很重要的工作就是评估算法的正确率,通常我们只提供已有数据的90%作为训练样本来训练分类器,而使用其余的10%数据去测试分类器,检测分类器的正确率。
  代码里我们定义一个计数器变量,每次分类器错误地分类数据,计数器就加1,程序执行完之后计数器的结果除以数据点总数即是错误率。
  为了测试分类器的效果,在kNN.py文件中创建函数datingClassTest,该函数是自包含的,可以在任何时候在Python运行环境中使用该函数测试分类器效果。

#分类器针对约会网站的测试代码
def datingClassTest():hoRatio = 0.10      #测试样本的比例datingDataMat,datingLabels = file2matrix("datingTestSet.txt")normMat,ranges,minVals = autoNorm(datingDataMat)m = normMat.shape[0]numTestVecs = int(m*hoRatio)  #测试样本的数量errorCount = 0.0for i in range(numTestVecs):classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],4)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))

在终端输入:

In[128]: reload(kNN)
Out[128]: 
<module 'kNN' from '/home/vickyleexy/PycharmProjects/handwriting_KNN/kNN.py'>
In[129]: kNN.datingClassTest()
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: 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 total error rate is: 0.030000

可以看出错误率为3%,可以改变datingClassTest内变量hoRatio和变量k的值,检测错误率是否变化。

使用算法:构建完整可用系统

  给海伦一段小程序,通过该程序,海伦可以在约会网站上找到某个人并输入他的信息,程序会给出她对对方喜欢程度的预测值。
  将下列代码加入到KNN.py文件中,并重新载入KNN

#约会网站预测函数
def classifyPerson():resultList = ['not at all','in small doses','in large doses']percentTats = float(raw_input("percentage of time spent playing video games?"))ffMiles = float(raw_input("frequent flier miles earned per year?"))iceCream = float(raw_input("liters of ice cream consumed per year?"))datingDataMat,datingLabels = file2matrix('datingTestSet.txt')normMat,ranges,minVals = autoNorm(datingDataMat)inArr = array([ffMiles,percentTats,iceCream])classifierResult = classify0((inArr - minVals)/ranges,normMat,datingLabels,3)print "You will probably like this person:",resultList[classifierResult - 1]

在终端输入以下,以了解程序的实际运行效果:

In[149]: reload(kNN)
Out[149]: 
<module 'kNN' from '/home/vickyleexy/PycharmProjects/handwriting_KNN/kNN.py'>
In[150]: kNN.classifyPerson()
percentage of time spent playing video games?>? 10
frequent flier miles earned per year?>? 10000
liters of ice cream consumed per year?>? 0.5
You will probably like this person: in small doses

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

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

相关文章

php微信用户绑定网站用户

php微信用户绑定网站用户实现原理&#xff1a;因为对于每个公共号&#xff0c;每个微信用户的open_id是固定不变的&#xff0c;也就是说可以利用网站用户id与微信用户的open_id建立一一对应关系。废话不多说&#xff0c;直接看代码&#xff1a; 数据库设计如下&#xff1a; 当…

JavaScript中mouseover和mouseout多次触发解决办法

问题描述 我希望当鼠标移动到id1上的时候&#xff0c;id2显示&#xff0c;当鼠标离开id1的时候&#xff0c;id2不显示。问题如下&#xff1a; 1.当鼠标从id1上移动到id2上的时候&#xff0c;id由有显示变为不显示&#xff0c;然后变为显示 2.当鼠标从id2上移动到id1上的时候…

怎样给自己的网站添加一个在浏览器标签、地址栏左边和收藏夹上显示的缩略logo标志

问题描述 不知道&#xff0c;大家有没有注意&#xff0c;有的网站&#xff0c;地址栏上都有一个小图标&#xff0c;如csdn或者是百度。 但是我个人做的网站就没有&#xff0c;怎样添加这样的图标呢&#xff1f; 其实&#xff0c;这个是通过favicon.ico来控制的。 favicon.ico…

当修改网站上的图片等资源时怎样避免客户缓存的问题

问题分析 最近在修改网站上的logo时候&#xff0c;发现修改后&#xff0c;浏览的时候&#xff0c;还是看到之前的图片&#xff0c;PC端多多刷新几次&#xff0c;显示倒是okey&#xff0c;可是手机端依旧是原图片。很明显是缓存的问题&#xff0c;但是我又不想清除手机浏览器缓…

在window中通过IIS发布自己的网站经验总结

转自&#xff1a;https://blog.csdn.net/YSG___/article/details/69061310?utm_mediumdistribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_sourcedistribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.c…

Win10下IIS配置、项目发布、添加网站

转自&#xff1a;https://study-life.blog.csdn.net/article/details/77006831?utm_mediumdistribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.control&depth_1-utm_sourcedistribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2…

内存泄露检查工具及相关网站

Visual Leak Detector http://xiaoruanjian.iteye.com/blog/1091410 灵活自由是C/C语言的一大特色&#xff0c;而这也为C/C程序员出了一个难题。当程序越来越复杂时&#xff0c;内存的管理也会变得越加复杂&#xff0c;稍有不慎就会出现内存问题。内存泄漏是最常见的内存问题之…

源码托管网站推荐——OKSvn

在团队开发时&#xff0c;没使用SVN或者其他版本控制工具必将带来很多不必要的麻烦。在本机搭建SVN的方法虽然可行&#xff0c;但你不能保证你的电脑一直处于运行状态&#xff0c;显然是很不方便的。 我们知道&#xff0c;新浪、谷歌都有项目托管&#xff0c;由于网速…

WordPress 在主题网站添加新年快乐红灯笼特效源码样式

在春节过年的时候看到有在WordPress博客网站添加了红灯笼新年快乐样式。很有过年气氛&#xff0c;今天就给大家分享一下具体的代码样式。 WordPress主题过节灯笼 CSS 样式 这个样式代码可以加在自己的主题 css 样式文件里&#xff0c;也可以单独写进去。部分 WordPress 主题&a…

网站变灰代码,一行代码让网站整体变灰,wordpress网站一行代码全站变灰教程

在遇到特殊情况的时候&#xff0c;我们作为站长需要紧急将网站变灰的需求&#xff0c;在此小编给大家总结了几种方法&#xff0c;通过简单修改一下站点样式即可实现。一段代码让网站整体变灰。这里主要介绍的利用 filter: grayscale属性来实现。供大家学习交流。 网站变灰代码…

WordPress插件 SuperPWA让你的WordPress网站瞬间变成APP

PWA 是 Progressive Web App 的英文缩写&#xff0c; 翻译过来就是渐进式增强 WEB 应用&#xff0c; 是 Google 在 2016 年提出的概念&#xff0c;2017 年落地的 web 技术。目的就是在移动端利用提供的标准化框架&#xff0c;在网页应用中实现和原生应用相近的用户体验的渐进式…

WordPress 网站怎么做会员中心功能【会员中心】

WordPress网站的会员后台与管理员后台默认是一样的&#xff0c;只不过功能少一些而已。但从整体版面上看&#xff0c;Wordpress 网站会员后台并不美观&#xff0c;很多站长并不喜欢这样的后台。那么对于使用 WordPress 建网站的站长&#xff0c;怎么样开发出一个版面美观的会员…

使用angular $interval服务实现购物网站秒杀活动时间倒计时

最近在做一个购物网站的秒杀活动,其中涉及到了一个时间的倒计时. 所谓“秒杀”&#xff0c;就是网络卖家发布一些超低价格的商品&#xff0c;所有买家在同一时间网上抢购的一种销售方式。通俗一点讲就是网络商家为促销等目的组织的网上限时抢购活动。由于商品价格低廉&#xf…

怎么扒站建站_深扒国内建站服务:网站建设哪家服务好?

企业如果想通过互联网来打响品牌&#xff0c;吸引更多客户&#xff0c;一个自己的官方网站是少不了的。如今各种建站服务商也有很多&#xff0c;但是服务质量良莠不齐&#xff0c;这该怎么选择呢&#xff1f;今天就跟大家深扒一下网站建设哪家服务好&#xff0c;让你明白企业到…

python与seo应用_python网络爬虫与SEO搜索引擎优化介绍

1. 什么是爬虫&#xff1f;首先应该弄明白一件事&#xff0c;就是什么是爬虫&#xff0c;为什么要爬虫&#xff0c;博主百度了一下&#xff0c;是这样解释的&#xff1a;网络爬虫(又被称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网…

PHP网站留言要加验证码,php – 需要一些帮助来添加一些验证码联系表单

嗨,我是PHP的新手,我想要一些帮助.我已经创建了一个联系表单,我想添加一些验证码.我已经创建了一些gif图像,其中包含添加了一些噪音的数字,并将no1命名为code_01.gif,no2等命名为code_02.gif等.我已经将其中的一些设置在我的表单上,静态地用于显示目的,如此&#xff1a;我想添加…

大型网站架构演变和知识体系

之前也有一些介绍大型网站架构演变的文章&#xff0c;例如LiveJournal的、ebay的&#xff0c;都是非常值得参考的&#xff0c;不过感觉他们讲的更多的是每次演变的结果&#xff0c;而没有很详细的讲为什么需要做这样的演变&#xff0c;再加上近来感觉有不少同学都很难明白为什么…

网站安全解决方案

网站安全解决方案1.项目背景根据国家计算机网络应急技术处理协调中心&#xff08;简称CNCERT/CC&#xff09;2008年上半年的统计报告&#xff0c;中国大陆被篡改网站的数量相比往年处于明显上升趋势&#xff0c;共监测到中国大陆被篡改网站总数达到35113 个&#xff0c;同比增加…

借双慧眼识别钓鱼欺诈网站

借双慧眼识别钓鱼欺诈网站 钓鱼欺诈网站&#xff0c;又称仿冒网站。这些网站的内容主要是复制那些正常网站的内容&#xff0c;使得网民粗一看几乎和正常网站一模一样&#xff0c;区别仅限于浏览器的地址。 曾有新闻报道有骗子在北京街头做了个假ATM机&#xff0c;这ATM机和市民…

curl网站开发指南

作者&#xff1a; 阮一峰 日期&#xff1a; 2011年9月 4日 我一向以为&#xff0c;curl只是一个编程用的函数库。 最近才发现&#xff0c;这个命令本身&#xff0c;就是一个无比有用的网站开发工具&#xff0c;请看我整理的它的用法。 curl网站开发指南 阮一峰 整理 curl是一种…