一、原理

手写数字识别,或者说图像识别的本质就是把如下图所示的一张图片转换成计算机能够处理的数字形式。

手写数字识别 机器学习 手写数字识别算法_python

1、图像二值化

将图片格式的数字4转换成由0和1组成的“新的数字4”。这是一个32×32的矩阵,数字1代表有颜色的地方,数字0代表无颜色的地方,这样就完成了手写数字识别的第一步也是最关键的一步:将图片转换为计算机能识别的内容——数字0和1,这个步骤又称为图像二值化。

手写数字识别 机器学习 手写数字识别算法_图像识别_02

2、二维数组转换为一维数组

经过图像二值化处理获得的32×32的0-1矩阵相当于一个二维数组,为了方便进行机器学习建模,还需要对这个二维数组进行简单的处理:在第1行数字之后依次拼接第2~32行的数字,得到一个1×1024的一维数组,利用这种一维数组就可以计算不同手写数字之间的距离,或者说这些手写数字的相似度,从而进行手写数字识别。

手写数字识别 机器学习 手写数字识别算法_图像识别_03

3、距离计算

手写数字图片处理后形成的1×1024的二维数组可以看成一个行向量,两张图片对应的行向量间的欧氏距离可以反映两张图片的相似度。因此,我们可以利用K近邻算法模型计算新样本与原始训练集中各个样本的欧氏距离,取新样本的K个近邻点,并以大多数近邻点所在的分类作为新样本的分类。

例如,有一个样本为手写数字4,将它转换为如下所示的1×1024的行向量。将另一个手写数字x转换为如下所示的1×1024的行向量,假设其只有中间一个数字不同。那么手写数字x与样本手写数字4的距离的计算过程如下。

手写数字识别 机器学习 手写数字识别算法_机器学习_04

二、代码实现

1、读取数据

import pandas as pd
df = pd.read_excel('手写字体识别.xlsx')
df.head()

手写数字识别 机器学习 手写数字识别算法_图像识别_05


其中第1列“对应数字”为目标变量y,其余1024列为特征变量X,我们的目的就是利用这些数据搭建手写数字识别模型。

2、提取特征变量和目标变量

X = df.drop(columns='对应数字') 
y = df['对应数字']

第1行代码用drop()函数删除“对应数字”列,将剩下的数据作为特征变量赋给X;第2行代码提取“对应数字”列作为目标变量赋给y。

3、划分训练集和测试集

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=123)

这里将test_size设置为0.2,即将20%的数据划分为测试集数据,并设置random_state为123(可以换成其他数字),使每次运行程序得到的数据划分结果保持一致。

4、模型搭建

from sklearn.neighbors import KNeighborsClassifier as KNN
knn = KNN(n_neighbors=5) 
knn.fit(X_train, y_train)

第1行代码从Scikit-Learn库引入K近邻算法分类模型(KNeighborsClassifier),并简写为KNN;第2行代码将KNN模型赋给变量knn,并设置n_neighbors为5,表示选择5个近邻点来决定新样本的分类;第3行代码用fit()函数进行模型的训练,其中传入的参数正是前面划分好的训练集数据X_train、y_train。

5、模型预测 - 预测数据结果

y_pred = knn.predict(X_test)
print(y_pred[0:100])

手写数字识别 机器学习 手写数字识别算法_手写数字识别 机器学习_06

6、预测准确度评估

a = pd.DataFrame()  # 创建一个空DataFrame 
a['预测值'] = list(y_pred)
a['实际值'] = list(y_test)
a.head()
# 预测准确度评估
from sklearn.metrics import accuracy_score
score = accuracy_score(y_pred, y_test)
score

手写数字识别 机器学习 手写数字识别算法_机器学习_07


手写数字识别 机器学习 手写数字识别算法_图像识别_08


将此时获得的score打印输出,结果为0.979,也就是说模型的预测准确度达到了97.9%。

学习资源《Python大数据分析与机器学习商业案例实战》