使用根据knn原理写的MNIST数字识别

我在CSDN上发的第一篇博客就是关于使用Python实现MNIST数字识别的,使用了sklearn库,没具体关心原理,这篇博文链接在这里(不知道为什么CSDN有时候老是加载不出页面来),从此我入了机器学习的坑。没想到有不少人看到了并向我要源码,现在看当时写的程序,因为对Python了解不够深入,导致很多地方的操作效率都很低。现在再发一篇关于knn实现手写数字识别的,这次用的是我自己手写的数字,与MNIST有点不一样,就不写很详细的解释了,如果有人看到了有什么问题可以在评论区评论,我尽可能及时回复。当然了knn对MNIST分类效果并不好,而且很慢,在Kaggle上有人使用神经网络可以达到99.9%的正确率了。下边是代码,详细请看注释。 

import numpy as np
import cv2
def testOne(n):
    test_img = cv2.imread(r"test_30/img"+str(n)+".png", 0)  #自己手写的图片,图片名都是img_n.jpg,n是图片的真实标签减1,当时写图片的时候没处理好。
    test_img = cv2.pyrDown(cv2.pyrDown(cv2.pyrDown(test_img))) #缩小图片尺寸
    test_img[test_img < 127] = 1 #使矩阵中每个小于127的值赋值为1
    test_img[test_img >= 127] = 0#使矩阵中每个小于127的值赋值为0
    # 上边的两句话顺序不可以颠倒
    test_img=np.reshape(test_img,[1225,1]) #每个图片都展开成一维向量
    # print(test_img.shape)
    train_img=np.load("trainIMG.npy") # 这里提前处理好了训练样本的矩阵,一共有100个样本,矩阵shape为[1225,100]
    train_lbl=np.load("trainLabels.npy") # 这是提前处理好的训练标签的矩阵[100,]
    # print(train_img.shape)
    # print(train_lbl.shape)
    distance=np.sum(np.square(train_img - test_img),axis=0) # 计算距离,不是必须开方的,节省运算
    # distance = np.sqrt(np.sum(np.square(train_img - test_img),axis=0))
    k=7
    args=np.argsort(distance)[:k] # 先对距离排序再挑选前k个距离最小值的数据下标
    # print(args)
    print(train_lbl[args]) # 找到训练标签里相对应下标的数据,就是前k个距离最小的标签了
    count=np.bincount(train_lbl[args]) # bincount方法可以百度一下,这里就是为了统计前k个距离最小标签(0-9数字)中每类(每个数字)的个数。
    # print(count)
    result=np.argmax(count) # 挑选出个数最多的那一类(那个数字,就是前k个最小距离样本标签中数目最多的那个标签了,这就是那个结果)
    return result
Result=np.zeros([30],dtype=np.int)
for i in range(30):
    Result[i]=testOne(i+1) # 这里i+1是为了和图片名匹配
print(Result)
res=np.ones([30],dtype=np.int)
for i in range(30):
    res[i]=Result[i]-i%10 # 这里是为了计算准确率,结果为0的表示预测数字与真实数字一致,不为0的表示不一致
print(res)
correct=np.where(res!=0)[0]
print("正确率:{:.4}%".format((1-correct.shape[0]/30)*100))

下边的截图是我的全部测试样本。 

下边是我的部分训练样本截图。

好吧其实区别不大………………

貌似没法在博客里传附件……只能上传到资源里边 ……资源分数竟然能不能设为0……好吧我也是醉了。资源链接:https://download.csdn.net/download/zugexiaodui/10802762

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值