热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【python】机器学习实战KNN算法之约会网站

一、算法流程:二、约会网站实例流程:三、代码详解:importnumpyasnpimportoperatorimportmatplot

一、算法流程:



二、约会网站实例流程:



三、代码详解:

import numpy as np
import operator
import matplotlib.pyplot as plt def classify(inX, dataset, labels, k):"""inX 是输入的测试样本,是一个[x, y]样式的dataset 是训练样本集labels 是训练样本标签k 是top k最相近的"""# shape返回矩阵的[行数,列数],# 那么shape[0]获取数据集的行数,# 行数就是样本的数量dataSetSize = dataset.shape[0] """下面的求距离过程就是按照欧氏距离的公式计算的。即 根号(x^2+y^2)"""# tile属于numpy模块下边的函数# tile(A, reps)返回一个shape=reps的矩阵,矩阵的每个元素是A# 比如 A=[0,1,2] 那么,tile(A, 2)= [0, 1, 2, 0, 1, 2]# tile(A,(2,2)) = [[0, 1, 2, 0, 1, 2],# [0, 1, 2, 0, 1, 2]]# tile(A,(2,1,2)) = [[[0, 1, 2, 0, 1, 2]],# [[0, 1, 2, 0, 1, 2]]] # 上边那个结果的分开理解就是:# 最外层是2个元素,即最外边的[]中包含2个元素,类似于[C,D],而此处的C=D,因为是复制出来的# 然后C包含1个元素,即C=[E],同理D=[E]# 最后E包含2个元素,即E=[F,G],此处F=G,因为是复制出来的# F就是A了,基础元素# 综合起来就是(2,1,2)= [C, C] = [[E], [E]] = [[[F, F]], [[F, F]]] = [[[A, A]], [[A, A]]]# 这个地方就是为了把输入的测试样本扩展为和dataset的shape一样,然后就可以直接做矩阵减法了。# 比如,dataset有4个样本,就是4*2的矩阵,输入测试样本肯定是一个了,就是1*2,为了计算输入样本与训练样本的距离# 那么,需要对这个数据进行作差。这是一次比较,因为训练样本有n个,那么就要进行n次比较;# 为了方便计算,把输入样本复制n次,然后直接与训练样本作矩阵差运算,就可以一次性比较了n个样本。# 比如inX = [0,1],dataset就用函数返回的结果,那么# tile(inX, (4,1))= [[ 0.0, 1.0],# [ 0.0, 1.0],# [ 0.0, 1.0],# [ 0.0, 1.0]]# 作差之后# diffMat = [[-1.0,-0.1],# [-1.0, 0.0],# [ 0.0, 1.0],# [ 0.0, 0.9]]diffMat =np. tile(inX, (dataSetSize, 1)) - dataset# diffMat就是输入样本与每个训练样本的差值,然后对其每个x和y的差值进行平方运算。# diffMat是一个矩阵,矩阵**2表示对矩阵中的每个元素进行**2操作,即平方。# sqDiffMat = [[1.0, 0.01],# [1.0, 0.0 ],# [0.0, 1.0 ],# [0.0, 0.81]]sqDiffMat = diffMat ** 2# axis=1表示按照横轴,sum表示累加,即按照行进行累加。# sqDistance = [[1.01],# [1.0 ],# [1.0 ],# [0.81]]sqDistance = sqDiffMat.sum(axis=1)# 对平方和进行开根号distance = sqDistance ** 0.5# 按照升序进行快速排序,返回的是原数组的下标。# 比如,x = [30, 10, 20, 40]# 升序排序后应该是[10,20,30,40],他们的原下标是[1,2,0,3]# 那么,numpy.argsort(x) = [1, 2, 0, 3]sortedDistIndicies = distance.argsort()# 存放最终的分类结果及相应的结果投票数classCount = {}# 投票过程,就是统计前k个最近的样本所属类别包含的样本个数for i in range(k):# index = sortedDistIndicies[i]是第i个最相近的样本下标# voteIlabel = labels[index]是样本index对应的分类结果('A' or 'B')voteIlabel = labels[sortedDistIndicies[i]]# classCount.get(voteIlabel, 0)返回voteIlabel的值,如果不存在,则返回0# 然后将票数增1classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1# 把分类结果进行排序,然后返回得票数最多的分类结果sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)return sortedClassCount[0][0]
def file2matrix(filename):"""从文件中读入训练数据,并存储为矩阵"""fr = open(filename)arrayOlines = fr.readlines()numberOfLines = len(arrayOlines) #获取 n=样本的行数returnMat = np.zeros((numberOfLines,3)) #创建一个2维矩阵用于存放训练样本数据,一共有n行,每一行存放3个数据classLabelVector = [] #创建一个1维数组用于存放训练样本标签。 #print(returnMat)index = 0for line in arrayOlines:# 把回车符号给去掉line = line.strip() # 把每一行数据用\t分割listFromLine = line.split('\t')# 把分割好的数据放至数据集,其中index是该样本数据的下标,就是放到第几行returnMat[index,:] = listFromLine[0:3]# 把该样本对应的标签放至标签集,顺序与样本集对应。classLabelVector.append(int(listFromLine[-1]))index += 1return returnMat,classLabelVectordef autoNorm(dataSet):"""训练数据归一化"""# 获取数据集中每一列的最小数值# 以createDataSet()中的数据为例,group.min(0)=[0,0]minVals = dataSet.min(0) # 获取数据集中每一列的最大数值# group.max(0)=[1, 1.1]maxVals = dataSet.max(0) # 最大值与最小的差值ranges = maxVals - minVals# 创建一个与dataSet同shape的全0矩阵,用于存放归一化后的数据normDataSet = np.zeros(np.shape(dataSet))m = dataSet.shape[0]# 把最小值扩充为与dataSet同shape,然后作差,具体tile请翻看 第三节 代码中的tilenormDataSet = dataSet - np.tile(minVals, (m,1))# 把最大最小差值扩充为dataSet同shape,然后作商,是指对应元素进行除法运算,而不是矩阵除法。# 矩阵除法在numpy中要用linalg.solve(A,B)normDataSet = normDataSet/np.tile(ranges, (m,1))return normDataSet, ranges, minValsdef datingClassTest():# 将数据集中10%的数据留作测试用,其余的90%用于训练hoRatio = 0.10datingDataMat,datingLabels = file2matrix('C:\\Users\\蓝月亮\\Desktop\\机器学习实战源代码\\machinelearninginaction\\Ch02\\datingTestSet2.txt') #load data setfrom file#print(datingDataMat)#print(datingLabels)normMat, ranges, minVals = autoNorm(datingDataMat)m = normMat.shape[0]print(m)numTestVecs = int(m*hoRatio)errorCount = 0.0for i in range(numTestVecs):classifierResult = classify(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],4)#print(classifierResult)print("the classifier came back with: %d, the real answer is: %d, result is :%s" % (classifierResult, datingLabels[i],classifierResult==datingLabels[i]))if(classifierResult != datingLabels[i]): errorCount+= 1.0print("the total error rate is: %f" % (errorCount/float(numTestVecs)))print(errorCount)


结果:选取K=4,正确率为96%100




推荐阅读
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
author-avatar
温暖白
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有