读懂《机器学习实战》代码—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

相关文章

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

Java 正则表达式的使用实战案例

《Java正则表达式的使用实战案例》本文详细介绍了Java正则表达式的使用方法,涵盖语法细节、核心类方法、高级特性及实战案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、正则表达式语法详解1. 基础字符匹配2. 字符类([]定义)3. 量词(控制匹配次数)4. 边