使用KNN近邻法进行手写识别

文章介绍了使用KNN(K-NearestNeighbor)分类算法进行手写数字识别的过程。通过读取训练数据集,将32x32的01代码转换为[1,1024]数组,构建训练集和标签集。然后利用OpenCV处理测试图片,将其转换为灰度图并调整尺寸,最后使用KNeighborsClassifier创建分类器进行训练和预测。
摘要由CSDN通过智能技术生成

 KNN近邻法

      邻近算法,或者说K最邻近(KNN,K-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是K个最近的邻居的意思,说的是每个样本都可以用它最接近的K个邻近值来代表。近邻算法就是将数据集合中每一个记录进行分类的方法

  1.  使用open()函数打开文件,对文件进行操作
  2. 使用os.listdir()函数获取下trainingDigits文件夹下的所有经过处理的手写数字(已转换成0,1代码)如下图所示                                       ,返回文件名的列表
  3. 通过对trainingDigits文件夹下的文件(文件中共32*32个01代码)进行循环读入一个数组中,每个文件形成一个[1,1024]这样的数组作为训练的数据集,将自己写的图片转为灰度图,并改变尺寸变为[1,1024]这样的数组作为测试的数据集,使用文件名的第一个数字作为训练的标签集([0,......1,......2.....,.....,9......])
  4. 构造KNN分类器对象,学习训练,并进行预测

 代码如下:

import cv2
from sklearn.neighbors import KNeighborsClassifier
import os
import numpy as np

np.set_printoptions(threshold=np.inf)


def load_data():
    fileList = os.listdir("./trainingDigits")

    x = []#训练的数据集
    y = []#训练的标签集
    # for循环得到:['0_0.txt', '0_1.txt', '0_10.txt', ...]
    for j in range(len(fileList)):
        # 得到文件名
        filename = fileList[j]
        with open("./trainingDigits/" + filename, 'r') as fd:
            list1 = []
            # 两个for循环:将一个文件中的数据写入形成[1,1024]这样的数据
            for i in range(32):
                data = fd.readline()#读出文件的每一行
                for j in data[:-1]:#换行符不读
                    list1.append(int(j))
            x.append(list1)#形成[1,1024]这样的数组
            y.append(int(filename[0])) #形成[0,0,.....,1,1,....,......,9,...]这样的标签集

    return x, y


# 处理写的图片,在画图中将背景颜色喷成黑色,拿白色的画笔写数字,
# 将画纸大小设为100*100的大小(需要是个正方形)
def getTestData(img):
    src = cv2.imread(img)
    gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)#将图片转为灰度图
    gray = cv2.resize(gray, (32, 32))#改变图片大小,变为[32,32]
    # print(gray)
    gray = gray.reshape(1, 1024)#改变数组形状[32,32]->[1,1024]

    return gray




if __name__ == "__main__":
    x_test = []
    # 1.获得trainingDigits目录中的数据训练集和标签集
    x_train, y_train = load_data()
    # 2.准备测试的数据集
    x_test.append(getTestData("7.png"))
    # 3.构造knn分类器对象
    knn = KNeighborsClassifier(n_neighbors=3)# k需要为奇数
    # 4.学习训练
    knn.fit(x_train, y_train)
    # 5.预测
    pre = []
    print("识别:", pre[i])
# 识别: [7]

 画图:

 trainingDigits文件夹:下载地址

 

 

使用k近邻识别手写数字,需要以下步骤: 1. 准备手写数字数据集。可以使用MNIST数据集,也可以使用其他手写数字数据集。 2. 对数据集进行预处理。将每个图像转换为一个向量,并将像素值从0到255的范围转换为0到1的范围。 3. 将数据集分为训练集和测试集。一般使用70%的数据作为训练集,30%的数据作为测试集。 4. 使用k近邻算法对测试集中的每个图像进行分类。对于每个测试图像,找到与它最近的k个训练图像,并将它们的标签进行统计。最终,将测试图像归为出现最多的标签类别。 下面是一个使用k近邻算法识别手写数字的Python代码示例: ```python from sklearn.datasets import load_digits from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score # 加载手写数字数据集 digits = load_digits() # 将数据集分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.3) # 创建K近邻分类器 knn = KNeighborsClassifier(n_neighbors=3) # 训练K近邻分类器 knn.fit(X_train, y_train) # 对测试集进行预测 y_pred = knn.predict(X_test) # 计算分类器的准确率 accuracy = accuracy_score(y_test, y_pred) print("准确率:", accuracy) ``` 在这个示例中,我们使用了scikit-learn库中的KNeighborsClassifier类来实现k近邻算法。我们将k设置为3,即对于每个测试图像,找到距离它最近的3个训练图像。 最后,我们使用accuracy_score函数计算分类器的准确率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值