使用KNN识别MNIST手写数据集(手写,不使用KNeighborsClassifier)

KNN识别MNIST手写数据集(32*32维),根据KNN原理一步步实现。

大家好,又见面了,我是你们的朋友全栈君。

数据集
提取码:mrfr

浏览本文前请先搞懂K近邻的基本原理:最简单的分类算法之一:KNN(原理解析+代码实现)

算法实现步骤:

  1. 数据处理。每一个数字都是一个32X32维的数据,如下所示:
    在这里插入图片描述
    knn中邻居一词指的就是距离相近。我们要想计算两个样本之间的距离,就必须将每一个数字变成一个向量。具体做法就是将32X32的数据每一行接在一起,形成一个1X1024的数据,这样我们就可以计算欧式距离。
  2. 计算测试数据到所有训练数据的距离,并按照从小到大排序,选出前K个
  3. 根据距离计算前K个样本的权重
  4. 将相同的训练样本的权重加起来,返回权重最大样本的标签

代码实现:

import os

def load_data(path):
    check = [i for i in range(10)]
    final_data = []
    
    for i in range(10):
        final_data.append([])
        
    files = os.listdir(path)    #文件夹
    for file in files:
        data = open(path + "/" + file)
        str = ""      #将所有数据接在一起
        temp = []
        for line in data.readlines():
            str = str + line[:-1]   #去掉回车,一行接一行
        for i in str:
            temp.append(int(i))   #变成数字
        final_data[check.index(int(file[0]))].append(temp)   #根据标签放在列表相应的位置

    return final_data, len(files)

def knn_mnist(K,test_data):
    train_data, length = load_data('manifold/digits/trainingDigits')
    distance = []     #存储测试数据到所有训练数据的距离
    
    for i in range(len(train_data)):
        for j in range(len(train_data[i])):
            res = 0
            for k in range(len(test_data)):
                res += (test_data[k]-train_data[i][j][k]) ** 2   #欧氏距离
            distance.append([res ** 0.5, i])   #距离+训练集数据标签

    distance = sorted(distance, key=(lambda x: x[0]))  #按距离从小到大排序
    weight = []   #权重与序号
    sum_distance = 0.0
    for i in range(K):
        sum_distance += distance[i][0]   #计算前K个距离的和
    for i in range(K):
        weight.append([1 - distance[i][0] / sum_distance, distance[i][1]])  #权重+序号
        
    #将相同序号的加起来
    num = []   #统计有哪些序号
    for i in range(K):
        num.append(weight[i][1])
    num = list(set(num))   #去重
    
    final_res = []
    for i in range(len(num)):
        res = 0.0
        for j in range(len(weight)):
            if weight[j][1] == num[i]:   #前K个标签一样的样本权值加起来
                res += weight[j][0]
        final_res.append([res, num[i]])

    final_res = sorted(final_res, key=(lambda x: x[0]),reverse=True)  # 按照权重从大到小排序

    return final_res[0][1]   #最终返回最大权值对应的标签

def test():
    K = 5
    test_data, length = load_data('manifold/digits/testDigits')
    #测试
    for i in range(len(test_data)):
        for j in range(len(test_data[i])):
            print(knn_mnist(K, test_data[i][j]))

if __name__ == '__main__':
    test()

  欢迎大家关注我的微信公众号:KI的算法杂记,有什么问题可以直接发私信。

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/125683.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • oracle 不是单组分组函数 查询条数,oracle不是单组分组函数 不是单组分组函数怎么解决…

    oracle 不是单组分组函数 查询条数,oracle不是单组分组函数 不是单组分组函数怎么解决…oracleORA-00937:非单组分组函数?这种错误报告通常使用聚合函数,如count和sum,但不使用groupby来声明分组模式。例如,有一个学生表。字段包括:班级编号、学生编号和学生姓名。现在我们需要知道每个班有多少人。如果查询语句是这样的:从学生表中选择班级编号,计数(学生编号),我们必须报告一个错误。我们必须告诉数据库根据哪个字段进行分组。正确的书写方法是:选择班级号,从学生表中…

    2022年6月29日
    24
  • JS–JavaScript变量详解(全局变量、局部变量)

    JS–JavaScript变量详解(全局变量、局部变量)JavaScript变量JavaScript使用var关键字声明变量。声明变量的5种常规用法如下:vara; //声明单个变量。var关键字与变量名之间以空格分隔varb,c; //声明多个变量。变量之间以逗号分隔vard=1; //声明并初始化变量。等号左侧是变量名,等号右侧是值vare=2,f=3; //声明并初始化多个变量。以逗号分隔多个变量…

    2022年6月5日
    37
  • 关于opencv报错:未定义标识符”CV_WINDOW_AUTOSIZE”[通俗易懂]

    关于opencv报错:未定义标识符”CV_WINDOW_AUTOSIZE”[通俗易懂]报错:未定义标识符”CV_WINDOW_AUTOSIZE”解决方案:在代码开头加入头文件#include<opencv2/highgui/highgui_c.h>

    2022年6月6日
    109
  • django 自定义user_3d模型下载源码

    django 自定义user_3d模型下载源码前言Django为我们提供了内置的User模型,不需要我们再额外定义用户模型,建立用户体系了。它的完整的路径是在django.contrib.auth.models.User。User模型源码分析

    2022年8月7日
    4
  • 什么是单页面应用开发工具_单页面和多页面的区别及优缺点

    什么是单页面应用开发工具_单页面和多页面的区别及优缺点单页面应用开发MPA与SPA简介MPAMPA(Multi-pageApplication)多页面应用指的就是最传统的HTML网页设计,早期的网站都是这样的设计,所之称为「网页设计」。使用MPA在使用者浏览Web时会依据点击需求切换页面,浏览器会不停的重载页面(Reload),整个操作也常感觉卡卡。如果使用这样的设计在WebApp中,使用者体验比较差,整体流畅度扣分…

    2022年10月13日
    2
  • 接口测试用例模板

    接口测试用例模板接口测试用例模板 用例标识 标题 模块 优先级 描述 前置条件 请求类型 请求参数 类型 操作步骤 预期结果 API001 请求使用正确的用户名和密码可以正确登录 用户登录 P1 测试当向登录接口使用正确用户名和密码进行请求可以正确得到登录成功的响应 无 get username string 1打开测试工具 2发送请求信息 3查看反馈信息 状态码:200

    2022年7月17日
    13

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号