读懂《机器学习实战》代码—K-近邻算法

2024-09-08 05:32

本文主要是介绍读懂《机器学习实战》代码—K-近邻算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一,K近邻算法概念

K近邻算法即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中。KNN 算法是一种 lazy-learning 算法,分类器不需要使用训练集进行训练,训练时间复杂度为0。KNN 分类的计算复杂度和训练集中的文档数目成正比,也就是说,如果训练集中文档总数为 n,那么 KNN 的分类时间复杂度为O(n)。

K 近邻算法使用的模型实际上对应于对特征空间的划分。K 值的选择,距离度量和分类决策规则是该算法的三个基本要素:
1,K 值的选择会对算法的结果产生重大影响。K值较小意味着只有与输入实例较近的训练实例才会对预测结果起作用,但容易发生过拟合;如果 K 值较大,优点是可以减少学习的估计误差,但缺点是学习的近似误差增大,这时与输入实例较远的训练实例也会对预测起作用,是预测发生错误。在实际应用中,K 值一般选择一个较小的数值,通常采用交叉验证的方法来选择最优的 K 值。随着训练实例数目趋向于无穷和 K=1 时,误差率不会超过贝叶斯误差率的2倍,如果K也趋向于无穷,则误差率趋向于贝叶斯误差率。,
2,该算法中的分类决策规则往往是多数表决,即由输入实例的 K 个最临近的训练实例中的多数类决定输入实例的类别
3,距离度量一般采用 Lp 距离,当p=2时,即为欧氏距离,在度量之前,应该将每个属性的值规范化,这样有助于防止具有较大初始值域的属性比具有较小初始值域的属性的权重过大。
二,K-近邻算法例子

假定有数据集

group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])lables = ['A','A','B','B']

算法步骤:

(1)计算已知类别数据集中的点与当前点之间的距离

(2)按照距离递增次序排序

(3)选取与当前点距离最小的K个点

(4)确定前K个点所在类别出现的频率

(5)返回前K个点出现频率最高的类别作为当前点的预测分类

程序理解:

from numpy import *
from matplotlib import *
import operatordef creatDataset():group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])lables = ['A','A','B','B']return group,lables#inX为用于分类的输入向量
#dataSet为输入的训练样本集
#lables为标签向量
#参数k表示用于选择最近邻居的数目
def classify0(inX,dataSet,lables,k):#array的shape函数返回指定维度的大小,如dataset为n*m的矩阵,#则dataset.shape[0]返回n,dataset.shape[1]返回m,dataset.shape返回n,m    dataSetSize = dataSet.shape[0]#tile函数简单的理解,它的功能是重复某个数组。比如tile(A,n),功能是将数组A重复n次,构成一个新的数组#所以此处tile(inX,(dataSetSize,1))的作用是将inX重复复制dataSetSize次,以便与训练样本集的样本个数一致#减去dataSet就是求出其差值,所以diffMat为一个差值矩阵diffMat = tile(inX,(dataSetSize,1))- dataSet#以下三行代码执行的是欧式距离的计算sqDiffMat = diffMat**2#平时用的sum应该是默认的axis=0,就是普通的相加,而当加入axis=1以后就是将一个矩阵的每一行向量相加,axis用于控制是行相加还是列相加sqDistances = sqDiffMat.sum(axis=1)distance = sqDistances**0.5#相关性的排序sortedDistance = distance.argsort()#<span style="text-indent: 28px;">确定前K个点所在类别出现的频率</span>classCount= {}for i in range(k):voteLable = lables[sortedDistance[i]]#dict.get(key, default=None)key 为字典中要查找的键,default如果指定键的值不存在时,返回该默认值值。此句代码用于统计标签出现的次数classCount[voteLable] = classCount.get(voteLable,0)+1#sorted函数参数解释,sorted(iterable, cmp=None, key=None, reverse=False)#iterable:是可迭代类型;#cmp:用于比较的函数,比较什么由key决定;#key:用列表元素的某个属性或函数进行作为关键字,有默认值,迭代集合中的一项;#reverse:排序规则. reverse = True  降序 或者 reverse = False 升序,有默认值。#返回值:是一个经过排序的可迭代类型,与iterable一样。#######operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号)######sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)#返回最符合的标签return sortedClassCount[0][0]group,lables=creatDataset()
#画出点的分布
pyplot.plot(group[:,0],group[:,1],'ro',label="point")
pyplot.ylim(-0.2,1.2)
pyplot.xlim(-0.2,1.2)#测试[0,0]所属类别
print classify0([0,0],group,lables,3)


测试可得[0,0]属于B类


更多numpy的用法:

numpy教程: http://blog.csdn.net/u013457382/article/details/50828646

这篇关于读懂《机器学习实战》代码—K-近邻算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

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

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

python多进程实现数据共享的示例代码

《python多进程实现数据共享的示例代码》本文介绍了Python中多进程实现数据共享的方法,包括使用multiprocessing模块和manager模块这两种方法,具有一定的参考价值,感兴趣的可以... 目录背景进程、进程创建进程间通信 进程间共享数据共享list实践背景 安卓ui自动化框架,使用的是

SpringBoot生成和操作PDF的代码详解

《SpringBoot生成和操作PDF的代码详解》本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的... 目录本文简介PDF文件简介代码实现PDF操作基于PDF模板生成,并下载完全基于代码生成,并保存合并P

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python