引入
在上一篇手写Naive Bayes分类器中,我们成功用自己写的 Naive Bayes 分类器处理了医疗记录数据。那我们的分类器能否用来处理其他类型的数据呢?答案当然是 可! 以! 的!在本次的实验中,我们将尝试一下处理图像数据。有木有很酷炫呢,那就一起搞起来吧!
实际问题
对于我们人类来说,识别手写数字并不是什么太大的问题。但是我们能否让机器也拥有识别手写数字的能力呢?下面我们就要在MNIST数据集上建立 Naive Bayes 分类器,教会机器识别手写数字。
MNIST介绍
MNIST其实是一个被广大人民群众用来练手的数据集,广到搜索引擎搜MNIST就会有大量相关的教程(手动微笑)。言归正传,MNIST中的每个图像由28*28个像素点组成,整个数据集一共包含了60000个训练样本和10000个测试样本,label有10个(0-9)。没错,它已经很贴心的分好了训练和测试。所以打开MNIST会发现有4个文件,分别是训练的image和label,测试的image和label。
MNIST读取
文件下下来以后,定睛一看,发现事情并不简单,它的后缀竟然是".gz"。不必惊慌,这就来解决这个问题。数据的读取方式请参考这里。
我们实际需要写的代码如下:
from mnist import MNIST
mndata = MNIST('保存四个文件的目录')
images,labels = mndata.load_training()
test_images,test_labels = mndata.load_testing()
为了更直观的了解数据集,咱们直接搞一个例子出来看一下:
import numpy as np
import matplotlib.pyplot as plt
p = np.array(images[9], dtype='uint8')
p = p.reshape((28, 28))
plt.imshow(p, cmap='gray')
plt.show()
一张不过瘾,我们把所有类的平均图像做出来看一下:
实现
数据了解的差不多,我们可以想一