k-近邻算法(KNN)--2改进约会网站的配对效果---by香蕉麦乐迪

2024-01-09 11:32

本文主要是介绍k-近邻算法(KNN)--2改进约会网站的配对效果---by香蕉麦乐迪,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考书籍:《机器学习实战》

实验说明:预测约会对象对用户是否具有吸引力

输入数据:每个待约会的对象有三个属性,分别是 每年飞行里程数、玩游戏占时间比、每周吃的冰淇淋(单位公升);(ps:我觉得这三个参数,分别代表一个人是否有钱,生活娱乐,饮食习惯)

样本集:有1000个约会对象的数据,并且每个对象有一个标签,标签有三大类,分别是  不喜欢、魅力一般、非常有魅力

实验过程:

1、将样本集90%当做训练集,10%当做测试集,测试classify.py的错误率

2、用户输入一个约会对象的参数,给出分类的标签,为用户提供建议


代码文件:

file2Matrix.py:样本集存在txt文件中,该函数将样本集输入到内存中,以array的方式存储起来

plotDataSet:将样本集的数据画出来(每个样本只能画出两个变量)

autoNorm.py:将参数归一化,每个参数的大小范围不一致

datingClassTest.py:错误率测试

classify.py:预测分类函数

classifyPerson.py:输入某个人的参数,给出预测结果

knn.py:主函数


样本集及源文件下载:点击打开链接


源文件:

file2Matrix.py:样本集存在txt文件中,该函数将样本集输入到内存中,以array的方式存储起来

__author__ = 'root'import numpy as npdef file2Matrix(filename):#open filefileHandle=open(filename,mode='r')#read lines, here lines is a listlines=fileHandle.readlines()#for saving datai=0datingDataSet=np.zeros((len(lines),3))labels=[]#traverse all lines,save to matrixfor line in lines:line=line.strip()listFromLine=line.split('\t')datingDataSet[i,:]=listFromLine[0:3]labels.append(int(listFromLine[-1]))i+=1#return dataSet and labelsreturn datingDataSet, labels


plotDataSet:将样本集的数据画出来(每个样本只能画出两个变量)

__author__ = 'root'import  numpy as np
import matplotlib.pyplot as pltdef plotDataSet(datingDataSet,labels):fig=plt.figure()ax=fig.add_subplot(111)ax.scatter(datingDataSet[:,0],datingDataSet[:,1],15*np.array(labels[:]),15*np.array(labels[:]))plt.show()


autoNorm.py:将参数归一化,每个参数的大小范围不一致

__author__ = 'root'import file2Matrix
import numpy as npdef autoNorm(datingDataSet):#get the minimum and maximum value of each featuredataSetMin=datingDataSet.min(axis=0)dataSetMinTiled=np.tile(dataSetMin,(datingDataSet.shape[0],1))dataSetMax=datingDataSet.max(axis=0)dataSetMaxTiled=np.tile(dataSetMax,(datingDataSet.shape[0],1))# =(value-min)/(max-min)datingDataSet=(datingDataSet-dataSetMinTiled)/(dataSetMaxTiled-dataSetMinTiled)return datingDataSet,dataSetMin,dataSetMax


datingClassTest.py:错误率测试

__author__ = 'root'import numpy as np
import classifydef datingClassTest(datingDataSet,labels):#set:ratio of test,kratio=0.1k=4#num of testDatalenOfDataSet=datingDataSet.shape[0]numOfTest=int(ratio*lenOfDataSet)print numOfTest#variable:num of errornumOfError=0#traverse all test datafor i in range(numOfTest):#prepare input datainX=datingDataSet[i,:]label=labels[i]ans=classify.classify(inX,datingDataSet[numOfTest:lenOfDataSet,:],labels[numOfTest:lenOfDataSet],k)if ans!=label:numOfError+=1.0print 'predict error'return numOfError/numOfTest


classify.py:预测分类函数

__author__ = 'root'import numpy as np
import operatordef classify(inX,dataSet,labels,k):#calculate euclidean distance between k and dataSetdataSetSize=dataSet.shape[0]diffMat=np.tile(inX,(dataSetSize,1))-dataSetsqDiffMat=diffMat**2sqDistances=sqDiffMat.sum(axis=1)distance=sqDistances**0.5#sort distance, min to max, return index listsortedDistIndicies=distance.argsort()# from 0 to k-1, count times of every classclassCount={}for i in range(k):className=labels[sortedDistIndicies[i]]#print classCount.get(className,0)#here parameter 0 means:if className doesn't exist, returnclassCount[className]=classCount.get(className,0)+1#sort class count result, i don't understand this method now#parameter reverse=true:from big to small,reverse=flase:from small to bigsortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)#print sortedClassCount#print sortedClassCount[0][0]# return resultreturn sortedClassCount[0][0]


classifyPerson.py:输入某个人的参数,给出预测结果

__author__ = 'root'import numpy as np
import classifydef classifyPerson(datingDataSet,dataSetMin,dataSetMax,labels):resultList=['not at all','a little like','like very much']k=3#input dataflyMiles=float(raw_input('please input fly miles per year:'))percOfVedioGames=float(raw_input('please input percentage of time you spend playing video games:'))iceCream=float(raw_input('please input how much iceCream you eat every week:'))inX=[flyMiles,percOfVedioGames,iceCream]inX=(inX-dataSetMin)/(dataSetMax-dataSetMin)#predictans=classify.classify(inX,datingDataSet,labels,k)ans=resultList[ans-1]#print resultprint 'you may feel this person:',ans


knn.py:主函数

__author__ = 'root'import file2Matrix
import plotDataSet
import autoNorm
import datingDataSetClassifyTest
import classifyPerson
import numpy as np#get data to ram
datingDataSetOri, labels=file2Matrix.file2Matrix('datingTestSet2.txt')
print 'datingDataSetOri:\n',datingDataSetOri
print 'labels:\n',labels#plot data
plotDataSet.plotDataSet(datingDataSetOri,labels)#autonorm data to [0,1]
datingDataSet,dataSetMin,dataSetMax=autoNorm.autoNorm(datingDataSetOri)
print 'datingDataSet:\n',datingDataSet#test error rate
errorRate=datingDataSetClassifyTest.datingClassTest(datingDataSet,labels)
print 'errorRate:',errorRate#pridect person
classifyPerson.classifyPerson(datingDataSet,dataSetMin,dataSetMax,labels)

总结:

knn的优点:算法简单,易于实现

knn的缺点:1、随着样本集的增加,计算时间线性增长,当特征数量增加时,计算复杂度也线性增加;2、没有训练过程,无法提取出对样本的特征表述


原文链接:点击打开链接

这篇关于k-近邻算法(KNN)--2改进约会网站的配对效果---by香蕉麦乐迪的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/586972

相关文章

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

nginx部署https网站的实现步骤(亲测)

《nginx部署https网站的实现步骤(亲测)》本文详细介绍了使用Nginx在保持与http服务兼容的情况下部署HTTPS,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录步骤 1:安装 Nginx步骤 2:获取 SSL 证书步骤 3:手动配置 Nginx步骤 4:测

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用

使用Python实现生命之轮Wheel of life效果

《使用Python实现生命之轮Wheeloflife效果》生命之轮Wheeloflife这一概念最初由SuccessMotivation®Institute,Inc.的创始人PaulJ.Meyer... 最近看一个生命之轮的视频,让我们珍惜时间,因为一生是有限的。使用python创建生命倒计时图表,珍惜时间