Knn算法实例(代码来自机器学习实战,我加了详细的注释,仅供学习)

article/2025/9/7 3:32:55

knn算法代码

Knn算法—识别手写数字(机器学习实战)


一、Knn算法原理?

1.通俗的说就是:对于给定的输入向量在训练集中找到与该输入实例最近的k个实例,统计这k个实例中每个实例(按照标签分类)所属的类。根据我们统计结果,把输入向量划分到该类中,预测值便是该类别(类中包含最多的实例)。

二、使用步骤

1.引入库

代码如下(示例):

from numpy import *
import operator

2.全部代码

代码如下(示例):

#createDataSet()返回值为:数据集(矩阵),标签列表(向量)。用来创建一个简单的数据集和标签
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
#classify0(),返回值为标签,输入一个向量,和数据集来判断输入向量的结果,一个三个形参
#inX是要预测的数据,dataSet为数据集,labels为数据集的对应标签列表(一维向量),k是kNN算法的k个最近邻。
def classify0(inX,dataSet,Labels,k):dataSetSize = dataSet.shape[0]diffMat = tile(inX,(dataSetSize,1)) - dataSetsqDiffMat = diffMat **2sqDistances = sqDiffMat.sum(axis = 1)distance = sqDistances ** 0.5sortedDistIndices = sqDistances.argsort()   #argsort()实现升序排列数据,返回的是原数据排列之前的索引值列表classCount = {}    #创建一个字典用于统计要预测的inX最近的k个近邻Labels标签for i in range(k): #for循环将k个最近的邻居存入到classCount{}字典中。形如{A:3,B:4}voteLabel = Labels[sortedDistIndices[i]]classCount[voteLabel] = classCount.get(voteLabel,0) + 1sortedClassCount = sorted(classCount.items(),key = operator.itemgetter(1),reverse = True)return sortedClassCount[0][0]
#将文本文件转换成可以处理的矩阵
def file2matrix(filename):fr = open(filename)                  #打开文件arrayOfLines = fr.readlines()        #将行文件逐行读出,readlines()返回值是以文件内容行为单位的列表numberOfLines = len(arrayOfLines)    #长度计算函数len()用来判断序列类型的长度,返回值是整数returnMat = zeros((numberOfLines,3))classLabelVector =[]index = 0for line in arrayOfLines:line = line.strip()                    #剔除文件行两端的空字符listFromLine = line.split("\t")        #文件的行一“\t"字符为分割符,分成最多分,然后存储到特征矩阵中returnMat[index,:] = listFromLine[0:3]classLabelVector.append(int(listFromLine[-1]))#用append()函数将文件的标签列表追加到classLableVector向量中index += 1return returnMat,classLabelVector          #将处理好的矩阵数据和标签向量返回
#归一化特征值
def autoNorm(dataSet):minValues = dataSet.min(0)maxValues = dataSet.max(0)ranges = maxValues - minValues#多余的初始化normData = zeros(shape(dataSet))m = dataSet.shape[0]normDataSet = dataSet - tile(minValues,(m,1))normDataSet = normDataSet/tile(ranges,(m,1))return normDataSet,ranges,minValues
#测试分类错误率
def datingClassTest():hoRatio = 0.1dataMatrix,dataLabels =  file2matrix("datingTestSet2.txt")normMatrix,ranges,minValues = autoNorm(dataMatrix)m = normMatrix.shape[0]useNumber = int(hoRatio*m)errorCounter = 0for i in range(useNumber):testResult = classify0(normMatrix[i,:],normMatrix[useNumber:m,:],dataLabels[useNumber:m],3)print("the classifier came back with:{},the real result is:{}".format(testResult,dataLabels[i]))if testResult != dataLabels[i]:errorCounter +=1print(errorCounter)print("the total error rate is:{}".format(errorCounter/(m*hoRatio)))
#将照片转换成1*1024的向量(二维)
def img2Vector(filename):returnVector = zeros((1,1024))fr = open(filename)for i in range(32):lineStr = fr.readline()for j in range(32):returnVector[0,32*i+j] = lineStr[j]return returnVector
'''a = convertImg("trainingDigits/0_13.txt")
print(a[32:64])'''
from os import listdir
def handwritingClassTest():hwLabels = []trainingFileList = 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 = listdir("testDigits")errorCount = 0.0mTest = 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 :{},the real answer is:{}".format(classifierResult,classNumStr))if classifierResult != classNumStr : errorCount += 1.0print("the total number of error is:{}".format(errorCount))print("the total error rate is:{}".format(errorCount/float(mTest)))
handwritingClassTest()

链接:(数据集)https://pan.baidu.com/s/1P2YqVIBXk826oFv2pO37Ag
提取码:w2mr


运行结果

在这里插入图片描述
若有错误错误欢迎各位不吝指正。


http://chatgpt.dhexx.cn/article/3JD8H83n.shtml

相关文章

KNN数据库检索(简读):A Fast Partial Video Copy Detection Using KNN and Global Feature Database

与之前的大部分部分视频拷贝检测(PVCD)算法不同,该算法会逐个扫描参考视频,我们将PVCD视为视频搜索/检索问题。 本文提出了一种快速的部分视频拷贝检测框架。在这个框架中,参考视频的所有帧CNN-feature都组织在…

KNN的优化算法2:KD-tree

传统KNN缺点:数据量特别大时,需要计算参考点和每个样本点的距离,计算量非常大,所以提出一种优化算法-----kd-tree. 为了提高kNN搜索的效率,可以考虑使用特殊的结构存储训练数据,以减小计算距离的次数。 kd…

KNN算法及其MATLAB代码

一、KNN算法原理 1.算法概述 k近邻(k-Nearest Neighbor,简称kNN)学习是一种常用的监督学习方法,其工作机制非常简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个"邻居&qu…

kNN算法解析及应用【内附详细代码和数据集】

首先,我们需要了解什么是“kNN” kNN英文全称k Nearest Neighbor,即k近邻算法。 用途:分类问题kNN的工作原理:事先有一个有标签的样本数据集,然后输入没有标签的新数据后,将新数据的每个特征和样本集里的数…

KNN算法介绍及代码实现

k-近邻法简介 k近邻法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法。它的工作原理是:存在一个样本数据集合,也称作为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数…

机器学习——KNN及代码实现

KNN KNN即k-nearest neighbor(k近邻法),多应用于分类问题。 k近邻法的输入为实例的特征向量,对应于特征空间中的点。输出为实例的类别。 K近邻法原理 给定一个训练数据集,对新的输入数据,在训练数据集中找到与该实例最邻近的k个…

KNN算法及其改进

KNN算法优缺点 优点 (1) 精度高 (2) 对异常值不敏感:某个异常值对整个结果不造成影响; (3) 无数据输入假定:无数据的独立性等假设;缺点 (1) 计算复杂度高:因为要计算的点需要与所有点计算距离,所以复杂度很…

机器学习算法-KNN代码实现

机器学习算法-KNN代码实现 一、KNN算法初步理解二、代码实现1.数据集处理2.创建model3.可视化 总结 一、KNN算法初步理解 统计学习方法书上的解释:给定一个训练数据集,对于新的输入实例,在训练数据集中找到与该实例最邻近的k个实例&#xff…

【数据挖掘基础】——KNN算法+sklearn代码实现(6)

🤵‍♂️ 个人主页:@Lingxw_w的个人主页 ✍🏻作者简介:计算机科学与技术研究生在读 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 目录 介绍算法的例子 KNN算法原理

KNN的优化算法1:距离加权

参考文章:https://www.cnblogs.com/bigmonkey/p/7387943.html 对参考文章中最后一部分说的有问题的地方进行了修改。 权值加权:为每个点的距离增加一个权重,使得距离近的点可以得到更大的权重,在此描述如何加权。 反函数 该方法最…

机器学习之深入理解K-means、与KNN算法区别及其代码实现

K-means方法是一种非监督学习的算法,它解决的是聚类问题。 1、算法简介:K-means方法是聚类中的经典算法,数据挖掘十大经典算法之一;算法接受参数k,然后将事先输入的n个数据对象划分为k个聚类以便使得所获得的聚类满足聚类中的对象…

KNN算法代码实现

原理: KNN 算法也叫K近邻算法。假设给定一个训练数据集,其中的实例类别已定。它是通过找到一个数据集中与目标数据最近的K个邻居,然后通过多数表决等方式来预测目标数据的分类结果进行预测。 三要素: 距离度量、K值、分类决策规…

KNN中的优化算法KD-tree

我们知道KNN是基于距离的一个简单分类算法,熟悉KNN的都知道,我们要不断计算两个样本点之间的距离,但是,试想一下,如果数据量特别大的时候,我们要每个都计算一下,那样计算量是非常大的&#xff0…

KNN算法代码

一、K近邻算法 KNN是一种监督学习类别的算法,全称(K-NearestNeighbor)直译为K个最近的邻居,是一种聚类算法。该算法认为我们在判断一个物体的类别可以根据与他非常相似的K个物体的类别(这K个物体的类别是已知的&#x…

KNN数据缺失值填充(附源码和数据)不调用包

KNN估计 数据缺失值填充—KNN估计一、基本思想二、步骤1.导入数据2.查看空缺值3.取出要分析的数据4.计算平均值5.计算标准差6.规范化7.计算欧几里得距离8.最优解9.画图 总结 数据缺失值填充—KNN估计 运行环境 python3.6 jupyter notebook 一、基本思想 先将数据标准化&…

数据挖掘——KNN算法的实现

👨‍💻作者简介:练习时长两年半的java博主 📖个人主页:君临๑ 🎁 ps:点赞是免费的,却可以让写博客的作者开心好几天😎 文章目录 一、k-最近邻分类算法介绍 二、k-NN的特…

KNN算法调优

1.所用方法: 交叉验证与网格搜索 交叉验证(为了让被评估的模型更加精确可信): 所有训练集数据分成N等分,几等分就是几折交叉验证 网格搜索:调参数 K-近邻:超参数K 2.API: sklearn.model_selection.GridSearchCV: CV即cross validation…

计算机编程—必备基础知识点

目录: 1. 编程语言1.1 编程1.2 计算机语言1.3 编程语言1.4 翻译器1.5 编程语言和标记语言区别 2. 计算机基础2.1 计算机组成2.2 数据存储2.3 数据存储单位2.4 程序运行 1. 编程语言 1.1 编程 编程:就是让计算机为解决某个问题而使用某种程序设计语言编…

计算机概论--计算机基础知识快速入门

0.前言1.计算机:辅助人脑的好工具 1.1计算机硬件的五大单元1.2CPU的种类1.3接口设备1.4运作流程 2.个人计算机架构与接口设备 2.1CPU2.2内存2.3显卡2.4硬盘与存储设备2.5主板 3.软件程序执行 3.1机器程序与编译程序3.2操作系统 3.2.1操作系统内核3.2.2系统调用 3.3小…

0基础如何开始学习计算机知识?

一、计算机的基本操作 计算机中只有文件和文件夹 计算机中,只有两样东西,文件和文件夹。 文件夹:本身不存储数据内容。文件夹是用来组织和管理文件的。 文件: 所有的txt文本文档,音乐,视频,图…