【机器学习】手写数字识别

前言

logistic回归,是一个分类算法,可以处理二元分类,多元分类。我们使用sklearn中的logistic对手写数字识别进行实践。

数据集

MNIST数据集来自美国国家标准与技术研究所,训练集由250个不同人手写数字构成,50%高中学生,50%来自人口普查局。

数据集展示

image

数据集下载

百度云盘:
链接:https://pan.baidu.com/s/1ZBU8XBsx7lp7gdN4ySSIWg
提取码:5mrf

关于使用pycharm图片不显示

pycharm默认会在右边进行绘图,由于某些原因导致图片不能显示,只能是白图的解决办法。

  • 我们可以首先把图片显示调到独立画框显示。file->settings->Tools->Python Scientific 取消勾选 show plots in tool window.
    image

  • 进行上述操作之后会独立弹出画框进行画图,如果仍然不能显示可以进行下面操作。

    • 找到Configure subplots
      image

    • 点击紧凑布局,就能显示,之前不能显示可能是因为图太大,导致我们没有看到。

      • 当然你也可以自己调整布局,行距列距什么的。
        image

逻辑回归手写数字识别

## logistis回归,是一个分类算法,可以处理二元分类,多元分类。
## 首先逻辑回归构造冠以的线性回归函数,然后使用sigmoid函数将回归值映射到散列类别


## sklearn 分类算法与手写数字识别

## 数据介绍
## MNIST数据集来自美国国家标准与技术研究所,训练集由250个不同人手写数字构成,50%高中学生,50%来自人口普查局


## 导包

import struct,os
import numpy as np
from array import array as pyarray
from numpy import append,array,int8,uint8,zeros

import matplotlib.pyplot as plt

from sklearn.metrics import accuracy_score, classification_report
from sklearn.linear_model import LogisticRegression

## 加载数据集
def load_mnist(image_file,label_file,path="mnist"):
    digits=np.arange(10)

    fname_image = os.path.join(path,image_file)
    fname_label = os.path.join(path, label_file)

    flbl = open(fname_label,'rb')
    magic_nr, size = struct.unpack(">II", flbl.read(8))
    lbl = pyarray("b",flbl.read())
    flbl.close()

    fimg = open(fname_image,'rb')
    magic_nr, size, rows, cols = struct.unpack(">IIII", fimg.read(16))
    img = pyarray("B",fimg.read())
    fimg.close()

    ind = [ k for k in range(size) if lbl[k] in digits ]
    N = len(ind)

    images = zeros((N, rows*cols),dtype = uint8)
    labels = zeros((N,1), dtype = int8)
    for i in range(len(ind)):
        images[i] = array(img[ind[i]*rows*cols : (ind[i]+1)*rows*cols]).reshape((1,rows*cols))
        labels[i] = lbl[ind[i]]

    return images,labels


train_image, train_label = load_mnist('train-images.idx3-ubyte', 'train-labels.idx1-ubyte')
test_image, test_label = load_mnist('t10k-images.idx3-ubyte','t10k-labels.idx1-ubyte')




## 数据展示
## 28*28

def show_image(imgdata, imgtarget, show_column, show_row,titlename):
    for index, (im, it) in enumerate(list(zip(imgdata, imgtarget))):
        xx = im.reshape(28,28)
        plt.subplots_adjust(left=1, bottom=None, right=3,top=2, wspace=None, hspace=None)
        plt.subplot(show_row,show_column,index+1)

        plt.axis('off')
        plt.imshow(xx, cmap='gray', interpolation='nearest')
        plt.title(titlename+':%i' % it)

    # plt.savefig(titlename+'.png')
    # 这个地方可能会有一个警告,可能因为图太大了,不过没关系,代码正常运行
    plt.show()




show_image(train_image[:50], train_label[:50],10,5,'label')

## sklearn 分类模型
## 数据归一化

train_image = [im/255.0 for im in train_image]
test_image = [im/255.0 for im in test_image]

print(len(train_image))
print(len(test_image))
print(len(train_label))
print(len(test_label))



## 模型分类
## 模型实例化
lr = LogisticRegression(max_iter=1000)
## 模型训练
lr.fit(train_image,train_label.ravel())

## 模型验证
predict = lr.predict(test_image)

print("accuracy score: %.4lf"% accuracy_score(predict,test_label))
print("classfication report for %s:n%sn"%(lr, classification_report(test_label, predict)))


show_image(test_image[:100],predict,10,10,'predict')

结果展示

  • 模型训练信息
  • 可以看到
    • 准确度:0.9256
    • 训练次数最大1000次
    • 精度、平均值、加权平均值等

image

  • 识别效果展示
    image

分析

我们展示了100张图片的识别效果,可以找到3张明显的识别错误,和模型的评估结果相似。
image

总结

我们可以多重复运行几次发现结果并没有变化,这可能也是logistic回归的缺点吧,我们也可以使用神经网络进行手写数字识别,但那是深度学习的内容,我们后续会对其进行实现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:【机器学习】手写数字识别 - Python技术站

(0)
上一篇 2023年4月2日 下午5:24
下一篇 2023年4月2日

相关文章

  • 【深度学习】DNN房价预测

    前言 我们使用深度学习网络实现波士顿房价预测,深度学习的目的就是寻找一个合适的函数输出我们想要的结果。深度学习实际上是机器学习领域中一个研究方向,深度学习的目标是让机器能够像人一样具有分析学习的能力,能够识别文字、图像、声音等数据。我认为深度学习与机器学习最主要的区别就是神经元。 深度学习中重要内容 建立模型——神经元 基本构造 一个神经元对应一组权重w,a…

    2023年4月2日
    00
  • 【机器学习】数据准备–python爬虫

    前言 我们在学习机器学习相关内容时,一般是不需要我们自己去爬取数据的,因为很多的算法学习很友好的帮助我们打包好了相关数据,但是这并不代表我们不需要进行学习和了解相关知识。在这里我们了解三种数据的爬取:鲜花/明星图像的爬取、中国艺人图像的爬取、股票数据的爬取。分别对着三种爬虫进行学习和使用。 体会 个人感觉爬虫的难点就是URL的获取,URL的获取与自身的经验有…

    2023年4月2日
    00
  • 【机器学习】支持向量机分类

    前言 支持向量机是一类按监督学习方式对数据进行二元分类的广义线性分类器,其决策边界是对学习样本求解的最大边距超平面。SVM尝试寻找一个最优决策边界,使距离两个类别最近的样本最远。SVM使用铰链损失函数计算经验风险并在求解系统中加入了正则化项以优化结构风险,是一个具有稀疏性和稳健性的分类器 。SVM可以通过核方法(kernel method)进行非线性分类,是…

    2023年4月2日
    00
  • 【机器学习】K-means聚类分析

    前言 聚类问题是无监督学习的问题,算法思想就是物以类聚,人以群分,聚类算法感知样本间的相似度,进行类别归纳,对新输入进行输出预测,输出变量取有限个离散值。本次我们使用两种方法对鸢尾花数据进行聚类。 无监督就是没有标签的进行分类 K-means 聚类算法 K-means聚类算法(k-均值或k-平均)聚类算法。算法思想就是首先随机确定k个中心点作为聚类中心,然后…

    2023年4月2日
    00
  • 【机器学习】线性回归预测

    前言 回归分析就是用于预测输入变量(自变量)和输出变量(因变量)之间的关系,特别当输入的值发生变化时,输出变量值也发生改变!回归简单来说就是对数据进行拟合。线性回归就是通过线性的函数对数据进行拟合。机器学习并不能实现预言,只能实现简单的预测。我们这次对房价关于其他因素的关系。 波士顿房价预测 下载相关数据集 数据集是506行14列的波士顿房价数据集,数据集是…

    2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部