手写数字识别示例

本示例展示了如何使用Python和机器学习库对8x8像素的手写数字图像进行分类和识别。手写数字数据集包含了从0到9的数字图像,每个图像由8x8的灰度值数组表示。将使用这些数组来可视化前四个图像,并展示每个图像代表的数字。

如果从图像文件(例如'png'文件)中工作,将使用matplotlib.pyplot.imread()来加载它们。但在这个例子中,直接使用数据集中的图像数组。

import matplotlib.pyplot as plt from sklearn import datasets, metrics, svm from sklearn.model_selection import train_test_split # 加载手写数字数据集 digits = datasets.load_digits() # 可视化前四个图像 fig, axes = plt.subplots(nrows=1, ncols=4, figsize=(10, 3)) for ax, image, label in zip(axes, digits.images, digits.target): ax.set_axis_off() ax.imshow(image, cmap=plt.cm.gray_r, interpolation="nearest") ax.set_title(f"Training: {label}") plt.show()

为了在这个数据上应用分类器,需要将图像展平,将每个8x8的灰度值二维数组转换成一维数组。这样,整个数据集的形状将是(n_samples, n_features),其中n_samples是图像的数量,n_features是每个图像中的像素总数。然后可以将数据集分成训练和测试子集,并在训练样本上拟合一个支持向量分类器。拟合后的分类器随后可以用来预测测试子集中样本的数字值。

# 展平图像 n_samples = len(digits.images) data = digits.images.reshape((n_samples, -1)) # 创建分类器:支持向量分类器 clf = svm.SVC(gamma=0.001) # 将数据分成50%的训练集和50%的测试集 X_train, X_test, y_train, y_test = train_test_split(data, digits.target, test_size=0.5, shuffle=False) # 在训练子集上学习数字 clf.fit(X_train, y_train) # 在测试子集上预测数字的值 predicted = clf.predict(X_test) # 可视化前四个测试样本,并显示它们的预测数字值 fig, axes = plt.subplots(nrows=1, ncols=4, figsize=(10, 3)) for ax, image, prediction in zip(axes, X_test, predicted): ax.set_axis_off() image = image.reshape(8, 8) ax.imshow(image, cmap=plt.cm.gray_r, interpolation="nearest") ax.set_title(f"Prediction: {prediction}") plt.show()

下面通过分类报告来展示主要的分类指标。分类报告为分类器构建了一个文本报告,显示了主要的分类指标,包括精确度、召回率、F1分数和支持度。

# 打印分类报告 print(f"Classification report for classifier {clf}:\n{metrics.classification_report(y_test, predicted)}\n")

还可以绘制真实数字值和预测数字值的混淆矩阵。混淆矩阵是一个表格,用于可视化算法性能,其中行表示真实类别,列表示预测类别。

from sklearn.metrics import ConfusionMatrixDisplay # 从预测构建混淆矩阵 disp = metrics.ConfusionMatrixDisplay.from_predictions(y_test, predicted) disp.figure_.suptitle("Confusion Matrix") print(f"Confusion matrix:\n{disp.confusion_matrix}\n") plt.show()

如果评估分类器的结果以混淆矩阵的形式存储,而不是以y_true和y_pred的形式,仍然可以按照以下方式构建分类报告:

# 真实值和预测值列表 y_true = [] y_pred = [] cm = disp.confusion_matrix # 对于混淆矩阵中的每个单元格,将相应的真实值和预测值添加到列表中 for gt in range(len(cm)): for pred in range(len(cm)): y_true += [gt] * cm[gt][pred] y_pred += [pred] * cm[gt][pred] # 从混淆矩阵重建分类报告 print("Classification report rebuilt from confusion matrix:\n" + metrics.classification_report(y_true, y_pred) + "\n")
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485