基于机器学习knn算法的手写拼音识别

简介: 基于机器学习knn算法的手写拼音识别

简单介绍一下knn算法


KNN算法,也叫K最近邻算法。功能是分类。算法逻辑非常简单,说直白点就是:先找到跟你最近的k个邻居(假设k=5),再看你的邻居给哪个类别投票(即邻居的标签),少数服从多数,得票最多的结果就是你的类别。

在这个算法中最关键的三点:

k值 :选择距离最近的k个邻居。 距离计算:计算距离的方法有欧式距离和曼哈顿距离,本文采用欧式距离,即先求差值的平方和,再开根号。 分类标签:本文的分类标签即a,b,c,d等字母

2.Python实现KNN

'''
k:k值
testdata:测试数据集
traindata:训练数据集
labels:分类标签
'''
def knn(k, testdata, traindata, labels):
    '''定义算法'''
    traindatasize = traindata.shape[0] #计算训练集的长度
    dif = tile(testdata,(traindatasize,1)) - traindata #将测试集扩展至训练集的长度,再求差值
    sqrdif = dif**2 #求差值的平方
    sumsqrdif = sqrdif.sum(axis=1) #求平方和
    distance = sumsqrdif**0.5 #再开根号,即所有的距离
    sorted_distance = distance.argsort() #对距离进行排序,返回排序后的索引
    count = {} #准备一个空字典,存放投票结果
    for i in range(0,k):  
        vote = labels[sorted_distance[i]] #提取索引多对应的标签值作为字典的key
        count[vote] = count.get(vote,0)+1  #票数作为字典的value
    sorted_count = sorted(count.items(),key=lambda x:x[1],reverse=True) #对最后的投票结果进行排序
    return sorted_count[0][0] #返回得票最多的标签

二、准备数据


陈悦用最笨的方法,花了一些时间,手写了一批png格式的数字图片


7556a03849575bb6acb5fa281464e990.png


ps:此处感谢陈悦同学的辛苦付出.

图片的尺寸都是统一的:32*32像素 图片的命名也是统一的:数字标签+"_"+第n张图+“.png"

2、将图片转换成数组矩阵


训练数据集与测试数据集都是标准化后的数组矩阵,而我们的试验对象是手写体数字图片,首先需要将图片进行一下数据化处理。

def img2Model(originDataPath, modelpath):
    list = os.listdir(originDataPath)
    for child in list:
        s_list = os.listdir(originDataPath + child)
        for i in s_list:
            filepath=originDataPath + child + '/' + i
            # print(filepath)
            img = cv2.imdecode(np.fromfile(filepath, dtype=np.uint8),0)
            img = cv2.resize(img, (32, 32))
            img = np.asarray(img)
            img[img > 127] = 255
            img[img <= 127] = 1
            img[img == 255] = 0
            dstFileName = modelPath + i.split('.')[0] + '.txt'
            np.savetxt(dstFileName, img, fmt='%d', delimiter=' ')


三、处理数据:训练集与测试集


1、区分训练集和测试集

# 随机分拣出测试集,其他文件为训练集
def shutildata(modelpath, trainpath, testpath):
    txtlist = os.listdir(modelpath)
    index = [random.randint(0, len(txtlist)) for i in range(10)]
    # print(index)
    arr = [txtlist[i].split('.')[0].split("_")[1] for i in index]
    for i in txtlist:
        try:
            if i.split(".")[0].split("_")[1] in arr:
                shutil.copy(modelpath + "/" + i, testpath)
            else:
                shutil.copy(modelpath + "/" + i, trainpath)
        except:
            pass


2、加载数据


# 加载数据
def load_data(dataFilePath):
    arr = np.loadtxt(dataFilePath, dtype=np.int)
    arr = arr.flatten()
    return arr

3、建立训练数据

# 建立训练数据集
def makeTrainData(trainpath):
    labels = []
    trainfile = os.listdir(trainpath)
    trainarr = np.zeros((len(trainfile), 1024))
    for i in range(0, len(trainfile)):
        # print(trainfile[i])
        thislabel = trainfile[i].split(".")[0].split("_")[0]
        if len(thislabel) != 0:
            labels.append(int(thislabel))
        trainarr[i, :] = load_data(trainpath + trainfile[i])
    return trainarr, labels


四、测试数据

# 验证
def validate(testpath, trainpath, k):
    trainarr, labels = makeTrainData(trainpath)
    testfiles = os.listdir(testpath)
    count = 0
    # 读取字典表
    with open('num_char.json', 'r') as f:
        dict = json.loads(f.read())
        # print(dict)
    for i in range(0, len(testfiles)):
        testpicname = testfiles[i].split("_")[0]
        testarr = load_data(testpath + testfiles[i])
        result = knn(k, testarr, trainarr, labels)
        testpicname = dict[str(testpicname)]
        result = dict[str(result)]
        print("真正字母:"+testfiles[i] +"  " + testpicname + "  " + "测试结果为:{}".format(result))
        if str(testpicname) == str(result):
            count += 1
    print("-----------------------------")
    print("测试集为:{}个,其中正确了{}个".format(len(testfiles),count))
    print("正确率为{}".format(count / len(testfiles)))
    print()

57e40dcd1bf6c7db99998eb08c65ebf2.png

相关文章
|
5天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
21 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
26天前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
1月前
|
机器学习/深度学习 算法 决策智能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
|
1月前
|
机器学习/深度学习 算法 Python
探索机器学习中的决策树算法:从理论到实践
【10月更文挑战第5天】本文旨在通过浅显易懂的语言,带领读者了解并实现一个基础的决策树模型。我们将从决策树的基本概念出发,逐步深入其构建过程,包括特征选择、树的生成与剪枝等关键技术点,并以一个简单的例子演示如何用Python代码实现一个决策树分类器。文章不仅注重理论阐述,更侧重于实际操作,以期帮助初学者快速入门并在真实数据上应用这一算法。
|
15天前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的决策树算法
【10月更文挑战第29天】本文将深入浅出地介绍决策树算法,一种在机器学习中广泛使用的分类和回归方法。我们将从基础概念出发,逐步深入到算法的实际应用,最后通过一个代码示例来直观展示如何利用决策树解决实际问题。无论你是机器学习的初学者还是希望深化理解的开发者,这篇文章都将为你提供有价值的见解和指导。
|
1月前
|
机器学习/深度学习 算法 大数据
机器学习入门:梯度下降算法(下)
机器学习入门:梯度下降算法(下)
|
1月前
|
机器学习/深度学习 算法 API
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
|
1月前
|
机器学习/深度学习 算法 数据处理
EM算法对人脸数据降维(机器学习作业06)
本文介绍了使用EM算法对人脸数据进行降维的机器学习作业。首先通过加载ORL人脸数据库,然后分别应用SVD_PCA、MLE_PCA及EM_PCA三种方法实现数据降维,并输出降维后的数据形状。此作业展示了不同PCA变种在人脸数据处理中的应用效果。
33 0
|
1月前
|
机器学习/深度学习 算法
机器学习入门:梯度下降算法(上)
机器学习入门:梯度下降算法(上)
|
6月前
|
机器学习/深度学习 存储 搜索推荐
利用机器学习算法改善电商推荐系统的效率
电商行业日益竞争激烈,提升用户体验成为关键。本文将探讨如何利用机器学习算法优化电商推荐系统,通过分析用户行为数据和商品信息,实现个性化推荐,从而提高推荐效率和准确性。
239 14

热门文章

最新文章