机器学习实战之KNN算法

knn(k近邻算法)——python 1. 基本定义 2. 算法原理 2.1 算法优缺点 2.2 算法参数 2.3 变种 3.算法中的距离公式 4.案例实现 4.1 导入相关库 4.2 读取数据 4.3 读取变量名 4.4 定义X,Y数据 4.5 分离训练集和测试集 4.6 计算欧式距离 4.7可视化距离矩阵 4.8 预测样本 4.9 查看正确率 4.10 交叉验证 5.scikit-learn的算法实现 5.1 对上述的再次实现: 5.2 另一种实现方式 阅读详情

一、KNN算法分析

k最近邻(KNN)分类算法应该是机器学习分类算法中最简单的算法了,它采用测量不同特征值之间的距离方法进行分类。它的思想很简单:如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本的大多数属于某一个类别,则该样本也属于这个类别。

KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类策略上只依据最近邻的一个或者多个样本的类别来决定待分类样本所属的类别。由于KNN方法主要靠周围有限的近邻的样本,而不是靠判别类域的方法类确定所属类别的,因此对于类域的交叉或者重叠较多的待分类样本集来说,KNN方法较其他方法更为合适。

该算法在分类时有个主要的不足是,当样本不平衡时,如果一个类的样本容量很大,而其他样本容量很小时,可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占大多数。因此可以采用权值的方法(和该样本的距离小的邻居权值大)来改进。该方法的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是实现对已知样本点进行剪裁,事先去除对分类作用不大的样本。该算法比较适合于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生无法。

总的来说就是我们已经存在了一个带标签的数据库,然后输入没有标签的新数据后,将新数据的每个特征与样本集中的数据对应的特征进行比较,然后算法提取样本集中特征最相似(计算上是最相近)的样本的标签。一般来说,只考虑样本集合中前K个最相似的数据。最后,选择K个最相似的数据中出现次数最多的分类。其算法描述如下:

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

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

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

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

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

二、python实现

对于机器学习来讲,python需要安装三个插件,分别是numpy,scipy,matplotlib。其中,前两个是用于数值计算的,最后一个是用于画图的。安装过程可参考网上的博客。

2.1 、KNN基础实践

我们用《机器学习实战》中第二单元的第一个例子,所用的数据可以到http://download.youkuaiyun.com/detail/hechenghai/9017133下载

#KNN算法
#input: inX:表示目标样本
#       dataSet:已知所属类型的样本集
#       labels:dataSet中样本的所属类别
#		K:用于比较的邻居的数量
#导入numpy
from numpy import *
import operator

#创建数据集
def createDataSet():

    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])#创建数组,表示有四个样本,每个样本有两个特征
    labels = ['a','a','b','b']#表示四个样本所属类别
    return group,labels
#用KNN算法进行分类
def classify0(inX,dataSet,labels,k):
    dataSetSize = dataSet.shape[0]#shape[0]表示行数,shape[1]表示列数
	#tile(A,reps)表示将A重复reps次创建一个矩阵
    diffMat = tile(inX,(dataSetSize,1)) - dataSet
    sqDiffMat = diffMat **2
    sqDistances = sqDiffMat.sum(axis=1)
    distances =sqDistances**0.5
	#对距离进行排序
    sortedDistIndices = distances.argsort()
    classCount={}#定义一个字典,可以增加元素
    voteIlabel = 0
    for i in range(k):
        voteIlabel = labels[sortedDistIndices[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
	#sorted(iterable[,cmp,[,key[,reverse=True]]])
# iterable:是可迭代类型;
#cmp:用于比较的函数,比较什么由key决定,有默认值,迭代集合中的一项;
#key:用列表元素的某个属性和函数进行作为关键字,有默认值,迭代集合中的一项;
#reverse:排序规则. reverse = True 或者 reverse = False,有默认值。
#返回值:是一个经过排序的可迭代类型,与iterable一样。
# itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号)
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    return  sortedClassCount[0][0]


这里我再对python的sorted函数进行说明:

>>> help(sorted)

Help on built-in function sorted in module__builtin__:

 

sorted(...)

sorted(iterable,cmp=None, key=None, reverse=False) --> new sorted list

iterable:是可迭代类型;

cmp:用于比较的函数,比较什么由key决定;

key:用列表元素的某个属性或函数进行作为关键字,有默认值,迭代集合中的一项;

reverse:排序规则. reverse =True  降序 或者 reverse = False 升序,有默认值。

返回值:是一个经过排序的可迭代类型,与iterable一样。

参数说明:

(1) cmp参数

cmp接受一个函数,拿整形举例,形式为:

def f(a,b):

     return a-b

如果排序的元素是其他类型的,如果a逻辑小于b,函数返回负数;a逻辑等于b,函数返回0;a逻辑大于b,函数返回正数就行了

(2) key参数

 key也是接受一个函数,不同的是,这个函数只接受一个元素,形式如下

def f(a):

     return len(a)

key接受的函数返回值,表示此元素的权值,sort将按照权值大小进行排序

(3) reverse参数

接受False 或者True 表示是否逆序

 

operator.itemgetter函数

operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号),下面看例子。

 

a = [1,2,3]

>>> b=operator.itemgetter(1)      //定义函数b,获取对象的第1个域的值

>>> b(a)

2

>>>b=operator.itemgetter(1,0)  //定义函数b,获取对象的第1个域和第0个的值

>>> b(a)

(2, 1)

 

要注意,operator.itemgetter函数获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值。

 

在上述代码中:

sortedClassCount =sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)

由于classCount是一个map所以需要取第二维的值作比较。


2.2、KNN实战提高

本节中,我们使用K近邻分类器的手写识别系统。为了简单起见,这里构造的系统只能识别数字0到9,如下图所示。需要识别的数字已经使用图形处理软件,处理成具有相同的色彩和大小:宽高是32像素*32像素的黑白图像。



#读取文件数据,将数据转化为一个向量
def img2vector(filename):
    returnVect = zeros((1,1024))#申请一个1*1024的矩阵
    fr = open(filename)#读取文件数据
    for i in range(32):
        lineStr = fr.readline()
        for j in range(32):
            returnVect[0,32*i+j]= int(lineStr[j])
    return returnVect
def handwritingClassTest():
    hwLabels = []#每个文件的标签
    trainingFileList = os.listdir('trainingDigits')#获得文件夹下的文件列表
    m = len(trainingFileList)#获取文件夹下的文件数目
    trainingMat =zeros((m,1024))
    for i in range(m):
        fileNameStr = trainingFileList[i]
        fileStr = fileNameStr.split('.')[0]
        classNumStr = int(fileStr.split('_')[0])#获取文件标签(根据文件名获取)
        hwLabels.append(classNumStr)
        trainingMat[i,:] = img2vector('trainingDigits/%s'%fileNameStr)
    testFileList = os.listdir('testDigits')#获取测试用例
    errorCount = 0.0
    mTest = len(testFileList)
    for i in range(mTest):
        fileNameStr = testFileList[i]
        fileStr = fileNameStr.split('.')[0]
        classNumStr = int(fileStr.split('_')[0])
        vectorUnderTest = img2vector('testDigits/%s'%fileNameStr)
        classifierResult =classify0(vectorUnderTest,trainingMat,hwLabels,3)
        print("the classifier came back with: %d, the real answeris : %d" %(classifierResult,classNumStr))
        if(classifierResult!=classNumStr):
            errorCount+=1.0
    print("\n the total number of errors is: %d"%errorCount)
    print("\n the total error rate is: %f"%(errorCount/float(mTest)))
 



 

【机器学习实战 Task1】 (KNN)k近邻算法的应用 1 背景 1.1 k近邻算法的概述 (1)k近邻算法的简介 k-近邻算法是属于一个非常有效且易于掌握的机器学习算法,简单的说就是采用测量不同特征值之间距离的方法对数据进行分类的一个算法。 (2)k近邻算法的工作原理 给定一个样本的集合,这里称为训练集,并且样本中每个数据都包含标签。对于新输入的一个不包含标签的数据,通过计算这个新的数据与每一个样本之间的距离,选取前k个,通常k小于20,以k个剧里最近的数据的标签中出现次数最多的标签作为该新加入的数据标签。 (3)k近邻算法的案例 当前统计了6部 阅读详情

相关推荐

机器学习实战k-邻近算法(kNN)简单实施代码解读

一.概念k-邻近算法是最简单的机器学习算法之一。k-邻近算法采用测量不同特征值之间的距离(具体说是欧氏距离)的方法进行分类。输入待分类的数据后,计算输入特征与样本集数据对应特征的距离,选择样本集中与输入特征距离最小的前k个样本,统计这k个样本数据中出现次数最多的类别作为新数据的分类。二.kNN的简单实施代码及注释from numpy import * import operatordef creat

SCUT_Arucee的博客 3269

分类算法KNN的python实现

KNN算法是有监督学习中的分类算法,它是一种非参的,惰性的算法模型。非参的意思并不是说这个算法不需要参数,而是意味着这个模型不会对数据做出任何的假设,与之相对的是线性回归(我们总会假设线性回归是一条直线)。也就是说KNN建立的模型结构是根据数据来决定的,这也比较符合现实的情况,毕竟在现实中的情况往往与理论上的假设是不相符的。惰性的意思是指模型在使用前不会被训练,只有当使用的时候才会被训练。KNN算法优点: 简单易用,相比其他算法,KNN算是比较简洁明了的算法。即使没有很高的数学基础也能搞清楚它的原理。

辉的博客 4308

机器学习实战(一) k-近邻算法(KNN)python3

机器学习实战(一) k-近邻算法概述原理KNN算法一般流程使用python导入函数创建KNN.py from numpy import * import operator def createDataSet():插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新...

weixin_42291486的博客 1301

用python实现KNN算法

KNN简介 KNN(K-nearest neighbor),即K近邻算法。当需要表示一个样本(值)的时候,就使用于该样本最接近的K个邻居来决定。KNN即可以用于分类,也可以用于回归。 数据集地址 https://vincentarelbundock.github.io/Rdatasets/csv/datasets/iris.csv RNN算法 # -*- coding:utf-8 -*- import numpy as np class KNN: def __init__(self,k):

技术宅--火狼的专栏 6090

机器学习之KNN(K近邻算法)实战

机器学习之KNN(K近邻算法)实战 本博客仅为记录个人学习KNN的一篇博文,主要参考自Jack-Cui的博客。希望初学者可以移步该博主的博客进行系统的学习。 1. KNN算法简介 k近邻法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法。它的工作原理是:存在一个样本数据集合(训练样本集),并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新的数据的每个特征与样本集中数据对应的特

qq_39215715的博客 567

String+CytoScape构建PPI网络

1.下载CytoScape Cytoscape是一款专业强大好用的物生信息分析软件,主要达用于专业的研究人员使用,软件主要适用于整合模块化网络和生物科学联系网络图的绘制,支持多种文件格式,导入后就可以直接进行编辑或者分析等操作了,除此之外,软件还提供了强大的编辑工具,支持添加相应的注释信息,软件基于java环境组件打造。 下载地址:https://cytoscape.org/ 因为软件基于java...

xiaobai1_1的博客 1万+

python实现KNN算法

使用numpy复现KNN算法。(1)更加了解算法以及熟练复现能力。(2)为后续优化改进KNN算法做铺垫。(3)涉及到的运算使用numpy,加快运算。后续,将会如kmeans算法一样,将三支决策思想融入进去,优化算法。使得knn算法的效果提升的更好。

aouiylfjh的博客 5516

Linux下开机异常(fsck exited with status code 4)

Linux下开机异常事情是这样的,本来我呢跑着程序听着歌,结果忽然就死机了,我只能强制关机,再次打开系统的时候,就提示这样fsck from util-linux 2.26.2 /dev/sda10 contains a file system with errors, check forced. /dev/sda10: Inodes that were part of a corrupted pr

芳草碧连天 2万+

Python实现KNN算法

KNN算法

qq_62945476的博客 1万+

Java实现双色球&大乐透随机选号算法——原理详解与代码实战

掌握核心语法:集合操作、随机数生成、排序。贴近实际场景:将编程知识应用于生活问题的解决。

wangchl0932的博客 4987

Java实战:绿盾加密文件批量解密工具Ldterm的实现与优化

本文详细介绍了基于Java开发的绿盾加密文件批量解密工具Ldterm的实现与优化过程。通过分析绿盾加密机制,结合Java流处理能力,实现了高效的文件解密方案,并分享了多线程处理、内存优化等性能提升技巧,适用于企业级数据迁移与备份场景。

weixin_29314405的博客 492

【机器学习】KNN近邻算法及实战案例(鸢尾花、手写数字识别)

K-Nearest Neighbors (KNN) 是一种简单且直观的机器学习算法,它属于监督学习的一种。KNN可以用于分类和回归问题,但最常用于分类。它的核心思想是:一个样本所属的类别可以通过与这个样本最近邻的几个训练样本的类别来决定。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 7976

【2026年华为暑期实习-非AI方向(通软&嵌软&测试&算法&数据科学)- 7月15日-第二题- 手机多载波冲突选择】(题目+思路+Java&C++&Python解析+在线测试)

摘要 本文提出了一种解决手机基站载波选择问题的回溯算法。给定N个载波,每个载波具有带宽和所属频段,要求选择最多K个载波,满足:1) 不选择同一频段的多个载波;2) 不选择冲突频段的载波;3) 总带宽最大化。算法通过预处理冲突关系,使用位掩码优化冲突检查,按编号顺序回溯枚举所有可能组合。当找到更大带宽或相同带宽但字典序更小的组合时更新答案。该方法在N≤25和K≤8的约束下高效可行,并通过样例验证了正确性。输出为最大总带宽和对应的最优载波编号序列。

m0_73659489的博客 71

【机器学习实战】K- 近邻算法(KNN算法)

K-近邻算法 一、概述 K-近邻算法,又称为KNN 算法,是数据挖掘技术中原理最简单的算法。 KNN的工作原理:给定一个已知类别标签的数据训练集,输入没有标签的新数据后,在训练数据集中找到与新数据最临近的 K 个实例。如果这 K 个实例的多数属于某个类别,那么新数据就属于这个类别。 简单理解为: 由那些离 X 最近的 K 个点来投票决定 X 归为哪一类 举个例子,可以用 KNN 算法来分类一部电影是爱情片还是动作片(利用打架镜头和接吻镜头来做大致判断) 这个表就是我们已有的数...

forever_bryant的博客 4233

Python爬虫实战:医院科室排班智能采集系统 - 从零构建合规且高效的医疗信息爬虫(附CSV导出 + SQLite持久化存储)!

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 1301

2026年软考信息安全工程师备考指南

信息安全工程师是信息产业部和人事部举办的软考中新增开的一门考试。软考全称全国计算机技术与软件专业技术资格(水平)考试,这门新开的信息安全工程师分属该考试“信息系统”专业,位处中级资格,是信息产业部和人事部在最新的“国人厅发[2007]139号文件中新增的专业。2016年下半年,第一次开考信息安全工程师(中级)考试。 考试科目: 1.信息安全基础知识,考试时间为150分钟,笔试,选择题; ...

鹿鸣天涯 7397

【P16 机器学习-分类算法及应用实践】KNN算法(分类思想、KNN算法原理、最近邻算法 、K近邻算法思想、KNN算法步骤、KNN算法实战、KNN算法优点/缺点总结)

本文介绍了KNN(K-最近邻)分类算法的基本原理与应用实践。KNN是一种基于相似度的分类方法,其核心思想是"物以类聚"。文章首先通过电影分类示例(爱情片/动作片)直观展示分类概念,随后详细阐述了KNN算法步骤:1)计算待分类样本与训练集样本的距离;2)选取距离最近的K个邻居;3)根据邻居类别投票确定分类结果。重点讨论了K值选择对分类效果的影响,并通过Python代码逐步实现KNN算法,包括距离计算、排序、投票统计等关键步骤。最后给出了完整程序实现,展示了如何通过KNN对未知电影类型进行分

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1131

Python 爬虫教程:企业官网基本信息抓取

本文介绍了使用Python爬虫技术抓取企业官网信息的方法,包括公司名称、简介、联系方式、地址、产品及新闻等数据。通过Requests和BeautifulSoup库实现网页请求与解析,并利用Pandas存储数据为CSV文件。同时提供了应对反爬虫机制(如设置User-Agent、代理IP池、延迟请求等)的解决方案,帮助高效获取企业公开数据。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1861

机器学习实战(一)(KNN近邻算法)

numpy模块方法提要 .T 求转置矩阵 .I 求逆矩阵

Alexin_lza的博客 260

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

k近邻算法_【白话机器学习】算法理论+实战之K近邻算法

1. 写在前面如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,在这简单的先捋一捋, 常见的机器学习算法:监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Adaboost等无监督算法:聚类,降维,关联规则, PageRank等为了详细的理解这些原理,曾经看过西瓜书,统计学习方法,机器学习实战等书,也听过一些机器学习的课程,但总感...

weixin_39736606的博客 583

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

机器学习实战之近邻算法kNN

kNN,k near neighbour,k近邻算法依据的是用欧氏距离公式来计算距离,距离越近越相似。# -*- coding: cp936 -*-#改造成自己可以理解的代码import osfrom numpy import *def classify0(inX,dataSet,labels,k):    '''        分类器,以dataSet为样本,分析出inX属于labels中的哪一...

weixin_41856754的博客 234

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

机器学习实战笔记(Python实现)-02-k近邻算法(kNN)

机器学习实战笔记(Python实现)-02-k近邻算法(kNN) -- 下面来看一下书上对这个算法的原理介绍:存在一个训练样本集,并且每个样本都存在标签(有监督学习)。输入没有标签的新样本数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取出与样本集中特征最相似的数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,而且k通常不大于20。最后选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

 啸林  1万+

机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN)

机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN)关键字:邻近算法(kNN: k Nearest Neighbors)、python、源码解析、测试作者:米仓山下时间:2018-10-21机器学习实战(Machine Learning in Action,@author: Peter Harrington)源码下载地址:https://...

weixin_30699831的博客 215

机器学习实战——KNN(K近邻算法)

首先,这篇博客是根据《机器学习实战》这本书写的,代码只是略有不同。书上的代码是python2.7版本的,我的python3.6有的用不了,各种问题。所以把我已经运行没问题的代码贴上来,再加上自己的一点注释。即是帮自己再次理解,也是帮助有可能因为问题运行不了的小伙伴。 KNN原理:根据已经有标签已经有类别的数据,凭借新输入样本与其最近的K个样本的类别来预测新输入的样本的类别。 先

qq_36393555的博客 637

【机器学习实战】KNN近邻算法

K-近邻算法概述 采用不同特征值之间的距离方法进行分类 优点:精度高、对异常值不敏感、无数据输入假定 缺点:计算复杂度高,空间复杂度高 适用范围:数值类型和标称型 有一个训练样本集,每个样本都有标签,输入新数据,将新数据和旧的进行比较,然后提取最相似数据的标签。一般是选择K个,不大于20,最后选择k个最相似数据中出现次数最多的分类,作为新数据的分类。 电影:亲吻次数、打斗次数来分...

u012067933的专栏 410

机器学习实战(一)—— K-近邻算法(KNN)

本篇文章主要介绍了K-近邻算法以及实现方式,并简单实现了约会网站的分析。

qq_52309640的博客 3419
上一篇: Windows下为64位的python3.4.3安装numpy
下一篇: Python数据结构:序列(列表[]、元组())与映射(字典{})语法总结
hechenghai
博客等级 码龄16年 146粉丝 232原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值