使用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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 网络-访问控制

    网络-访问控制1.访问控制访问控制就是限制访问主体对访问客体的访问权限控制,决定主体对客体能做什么和做到什么程度访问主体(主动):用户,进程,服务访问客体(被动):数据库,资源,文件2.访问控制的两个过程认证:先由认证来检验主体(用户)的合法身份,在访问控制之前授权:由管理员决定和限制主体(用户)对资源的访问级别!!注意:审计也在主体对客体访问的过程中,但是,审计是访问过程中,对访问情况的记录和审查,他只是产生一些log,用来分析安全事故产生的原因,和访问控制无关,就是个辅助用的,可要可不要。3.访问控制

    2022年7月23日
  • JAVA四舍五入保留一位小数

    JAVA四舍五入保留一位小数newBigDecimal(speed).setScale(1,BigDecimal.ROUND_HALF_UP).doubleValue()

    2022年5月11日
  • python换行符号怎么用_python中回车用什么表示

    python换行符号怎么用_python中回车用什么表示1、python语句,一般使用换行分隔,也就是说一行一条语句,一行过长的语句可以使用反斜杠(\)分解成几行小栗子#-*-coding:utf-8-*-#!/usr/bin/envpythona=102if(a==102)and\(a!=0):printa2、当然,不使用反斜线也可以跨行,那么就是用传说中的“三引号:(”””)”小栗子(如果打印的内容需要分成多行…

    2022年10月7日
  • Springboot整合RabbitMQ详细讲解

    Springboot整合RabbitMQ详细讲解搭建RabbitMQ环境Springboot整合RabbitMQ1、添加整合依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>2、配置application.yml提供者1)创建交换机和队列@Configurati

    2022年5月15日
  • Linux 安装tomcat 部署war包项目

    Linux 安装tomcat 部署war包项目准备工作:jdk-8u161-linux-x64.tar.gz链接:https://pan.baidu.com/s/1zQGL_cfN5jFWshZkAJOkNw密码:0u7dapache-tomcat-9.0.20.zip链接:https://pan.baidu.com/s/1Nf_qdmUVlQ0Cz8BOoQg2rA密码:bh9f以及你的war包…

    2022年6月11日
  • 记念刘和珍君是什么文体_纪念原版

    记念刘和珍君是什么文体_纪念原版转载自Tony2009年12月15日19:48阅读(6)评论(0)分类:休闲搞笑权限:公开刚和蘑菇头在安中楼楼下聊天,忽闻VeryCD被封的消息,网上骂声一片,满腔愤慨无处发泄,遂成此文。鲁迅先生先知,如今中国的种种奇景,先生几十年前便已洞悉一切。———————————————…

    2022年8月10日

发表回复

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

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