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

相关文章

基于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创建生命倒计时图表,珍惜时间

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费