读懂《机器学习实战》代码—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并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

Python使用Code2flow将代码转化为流程图的操作教程

《Python使用Code2flow将代码转化为流程图的操作教程》Code2flow是一款开源工具,能够将代码自动转换为流程图,该工具对于代码审查、调试和理解大型代码库非常有用,在这篇博客中,我们将深... 目录引言1nVflRA、为什么选择 Code2flow?2、安装 Code2flow3、基本功能演示