系列文章目录
数据来源及说明
MNIST数据集是美国国家标准与技术研究院的比较常用的一个手写数字数据集。
而scikit-learn软件包中提供的是加州大学尔湾分校(UCI) 的数据集。
UCI的手写数据集包含1797张 8 * 8 像素灰度图片, 每个图片都是一张手写的数字。
为了使图片能够作为感知机的输入,我们把每张图片展开成长度为64的向量。向量的值表示像素的灰度,通常我们会把数值归一化到 [0,1] 这个区间,防止过大的值给感知机学习权重带来不必要的难度。较大的输入值通常意味着需要较大的权重。同时在训练感知机的过程中,权重的更新量也受到输入大小的影响,过大的输入可能会使权值更新幅度过大,造成模型不稳定。
代码操作
先来预览一下数据集中的图片
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
# 加载UCI手写数字数据集
digits = load_digits()
for i in range(10):
# 显示1行10列中的第 i+1 个图
plt.subplot(1,10,i+1)
plt.imshow(digits.images[i])
# 隐藏坐标轴刻度
plt.axis('off')
plt.show()
我们将图像的每个像素点作为一个输入维度,因此,分类手写数字这个任务的输入维度比较高。但是每两个数字之间在一些特定区域都有显著的不同之处,在所有像素点构成的高维空间里(对于 UCI数据集来说是64维空间),这些数字其实分布在几乎 线性可分 的不同区域。所以,分类手写数字这个任务恰好落在感知机的能力范围之内。
单个感知机的输出通常可以用来区分两个类别:超过某阈值表明输入样本属于类别A,低于该阈值则表明属于类别B。通常,我们不会采用单一输出来区分更多类别,即使激活函数的输出值是连续的,也通常仅用来表示两种状态,因为输出值通常集中于0或者1附