现在我来为你讲解Python实现kNN算法识别手写体数字的示例代码的完整攻略。本文主要包含以下几个部分:
- kNN算法简介
- 数据集介绍
- 实现过程
- 示例说明
- 总结
1. kNN算法简介
kNN算法是一种基于距离度量进行分类的机器学习算法。其全称为k-Nearest Neighbor(k近邻)算法。kNN算法的核心思想是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
2. 数据集介绍
kNN算法的一个重要应用就是手写数字识别。在本示例中,我们使用UCI机器学习库中的手写数字数据集,该数据集包含训练集和测试集,每个样本都是一个28*28的灰度图像,共有10个类别(数字0-9)。
3. 实现过程
下面我们将详细介绍Python实现kNN算法识别手写体数字的代码实现过程。
3.1 加载数据集
首先,我们需要从文件中加载训练集和测试集,并将它们解析成矩阵形式。这里我们使用numpy库来实现:
import numpy as np
def load_data(filename):
data = np.loadtxt(filename, delimiter=',')
X = data[:, 1:] # 特征矩阵(去掉标签列)
y = data[:, 0] # 标签列
return X, y
X_train, y_train = load_data('train.csv')
X_test, y_test = load_data('test.csv')
3.2 特征归一化
为了确保不同特征对分类结果的影响程度相同,我们需要对特征进行归一化处理。这里我们采用z-score标准化方法:
def standardize(X_train, X_test):
mu = np.mean(X_train, axis=0) # 计算每个特征的均值
sigma = np.std(X_train, axis=0) # 计算每个特征的标准差
X_train = (X_train - mu) / sigma
X_test = (X_test - mu) / sigma
return X_train, X_test
X_train, X_test = standardize(X_train, X_test)
3.3 kNN算法实现
接下来,我们需要实现kNN算法。这里我们采用欧几里得距离作为距离度量:
def euclidean_distance(x1, x2):
return np.sqrt(np.sum((x1 - x2)**2))
class kNN:
def __init__(self, k=3):
self.k = k
def fit(self, X, y):
self.X_train = X
self.y_train = y
def predict(self, X):
y_pred = np.zeros(X.shape[0])
for i, X_test in enumerate(X):
# 计算测试样本到每个训练样本的距离
distances = [euclidean_distance(X_test, x) for x in self.X_train]
# 获取距离最近的k个样本的标签
k_idx = np.argsort(distances)[:self.k]
k_labels = [self.y_train[idx] for idx in k_idx]
# 从k个样本中选择出现频率最高的类别作为预测结果
class_counts = np.bincount(k_labels)
y_pred[i] = np.argmax(class_counts)
return y_pred
3.4 模型训练与测试
最后,我们可以使用以上代码实现kNN算法对手写数字数据集进行训练和测试:
knn = kNN(k=3)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
accuracy = np.mean(y_pred == y_test)
print('Accuracy:', accuracy)
4. 示例说明
接下来,我们将展示两个实际例子,帮助读者更好地理解kNN算法在手写数字识别中的应用。
4.1 示例1:识别单个手写数字图片
首先,我们加载一张手写数字的图片,对其进行灰度化处理并将其转换成矩阵形式。假设我们加载的图片为数字2,代码如下:
import cv2
img = cv2.imread('two.png', cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (28, 28))
X_single = np.array(img).flatten()
然后,我们可以使用训练好的kNN模型对该图片进行预测:
y_single_pred = knn.predict([X_single])[0]
print('Predict:', y_single_pred)
4.2 示例2:可视化kNN算法分类效果
其次,为了更直观地了解kNN算法的分类效果,我们可以将训练集和测试集中的一些样本以及它们的真实标签和预测标签可视化出来。代码如下:
import matplotlib.pyplot as plt
def plot_digits(X, y, preds=None):
X = X.reshape(-1, 28, 28)
fig, axs = plt.subplots(nrows=4, ncols=10, sharex=True, sharey=True)
axs = axs.flatten()
for i in range(40):
img = X[i]
if preds is None:
axs[i].title.set_text('True:{0}'.format(int(y[i])))
else:
axs[i].title.set_text('True:{0}, Pred:{1}'.format(int(y[i]), int(preds[i])))
axs[i].imshow(img, cmap='Greys', interpolation='nearest')
plt.show()
plot_digits(X_test[:40], y_test[:40], y_pred[:40])
5. 总结
本文详细介绍了Python实现kNN算法识别手写体数字的示例代码的完整攻略,包括数据集介绍、特征归一化、kNN算法实现、模型训练与测试等。通过实际的例子,我们展示了如何使用训练好的kNN模型对单个手写数字图片进行识别,并且将分类效果可视化出来。希望读者可以通过这篇文章更好地了解kNN算法在手写数字识别中的应用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现kNN算法识别手写体数字的示例代码 - Python技术站