通过knn算法实现识别数字
项目要求
导入一张包含5000个0-9的手写数字,通过knn算法训练模型识别出新导入的数字。
代码实现
import numpy as np
import cv2
from sklearn.neighbors import KNeighborsClassifier
img = cv2.imread('digits.png') # 导入训练的模型所需要的图片
img1 = cv2.imread('5.png')
grey = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 将图片转换为灰度图
grey1 = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
new = np.array(grey1) # 转换为矩阵
new = new.reshape(1,400).astype(np.float32)
cells = [np.hsplit(i,100) for i in np.vsplit(grey,50)] # 将矩阵中进行水平切割50次,垂直切割100次即分隔成5000份数据
a = np.array(cells)
train = a[:,:50] # 将2500份划分为测试集
test = a[:,50:100] # 将另外2500份数据划分为训练集
train_new = train.reshape(-1,400).astype(np.float32) # 将所有数据转化为包含2500个1行400列数据的二维矩阵
test_new = test.reshape(-1,400).astype(np.float32)
'''添加结果y'''
k = np.arange(10)
labels = np.repeat(k,250)
train_labels = labels[:,np.newaxis]
test_labels = np.repeat(k,250)[:,np.newaxis]
'''使用sklearn库训练模型'''
knn = KNeighborsClassifier(n_neighbors=3) # 设置k值为3
knn.fit(train_new,train_labels) # 开始训练模型
test_predict = knn.predict(test_new) # 预测训练结果
score=knn.score(test_new,test_labels) # 获取准确率
print('准确率为{}'.format(score))
new_predict = knn.predict(new)
print('识别为{}'.format(new_predict))
导入的图片:
新导入的数字图片:
输出结果为:
准确率为0.9164
识别为[2]
注意事项
运行此代码需要安装以下 Python 库:
- numpy
- matplotlib
- scikit-learn
- opencv-python
KNN 算法的性能受 k 值影响较大,一般来说,较小的 k 值可能导致过拟合,较大的 k 值可能导致欠拟合。通过测试不同的 k 值,我们可以找到在当前数据集上表现最佳的参数。所有可以通过多次改变k值找到能够获取最高准确率的最佳k值。
此代码包含以下步骤:数据加载与预处理、KNN 模型训练与预测、模型评估、结果可视化、参数优化。