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

相关文章

如何关闭Mac的Safari通知? 3招教你关闭Safari浏览器网站通知的技巧

《如何关闭Mac的Safari通知?3招教你关闭Safari浏览器网站通知的技巧》当我们在使用Mac电脑专注做一件事情的时候,总是会被一些消息推送通知所打扰,这时候,我们就希望关闭这些烦人的Mac通... Safari 浏览器的「通知」功能本意是为了方便用户及时获取最新资讯,但很容易被一些网站滥用,导致我们

Kotlin Compose Button 实现长按监听并实现动画效果(完整代码)

《KotlinComposeButton实现长按监听并实现动画效果(完整代码)》想要实现长按按钮开始录音,松开发送的功能,因此为了实现这些功能就需要自己写一个Button来解决问题,下面小编给大... 目录Button 实现原理1. Surface 的作用(关键)2. InteractionSource3.

Web技术与Nginx网站环境部署教程

《Web技术与Nginx网站环境部署教程》:本文主要介绍Web技术与Nginx网站环境部署教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Web基础1.域名系统DNS2.Hosts文件3.DNS4.域名注册二.网页与html1.网页概述2.HTML概述3.

使用WPF实现窗口抖动动画效果

《使用WPF实现窗口抖动动画效果》在用户界面设计中,适当的动画反馈可以提升用户体验,尤其是在错误提示、操作失败等场景下,窗口抖动作为一种常见且直观的视觉反馈方式,常用于提醒用户注意当前状态,本文将详细... 目录前言实现思路概述核心代码实现1、 获取目标窗口2、初始化基础位置值3、创建抖动动画4、动画完成后

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

Java实现图片淡入淡出效果

《Java实现图片淡入淡出效果》在现代图形用户界面和游戏开发中,**图片淡入淡出(FadeIn/Out)**是一种常见且实用的视觉过渡效果,它可以用于启动画面、场景切换、轮播图、提示框弹出等场景,通过... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

macOS Sequoia 15.5 发布: 改进邮件和屏幕使用时间功能

《macOSSequoia15.5发布:改进邮件和屏幕使用时间功能》经过常规Beta测试后,新的macOSSequoia15.5现已公开发布,但重要的新功能将被保留到WWDC和... MACOS Sequoia 15.5 正式发布!本次更新为 Mac 用户带来了一系列功能强化、错误修复和安全性提升,进一步增

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ