您的位置:首页 > 脚本大全 > > 正文

python蓝牙knn算法(python使用KNN算法识别手写数字)

更多 时间:2021-10-12 00:33:39 类别:脚本大全 浏览量:232

python蓝牙knn算法

python使用KNN算法识别手写数字

本文实例为大家分享了python使用knn算法识别手写数字的具体代码,供大家参考,具体内容如下

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • # -*- coding: utf-8 -*-
  • #pip install numpy
  • import os
  • import os.path
  • from numpy import *
  • import operator
  • import time
  • from os import listdir
  •  
  • """
  • 描述:
  •   knn算法实现分类器
  • 参数:
  •   inputpoint:测试集
  •   dataset:训练集
  •   labels:类别标签
  •   k:k个邻居
  • 返回值:
  •   该测试数据的类别
  • """
  • def classify(inputpoint,dataset,labels,k):
  •   datasetsize = dataset.shape[0] #已知分类的数据集(训练集)的行数
  •   #先tile函数将输入点拓展成与训练集相同维数的矩阵,再计算欧氏距离
  •   diffmat = tile(inputpoint,(datasetsize,1))-dataset #样本与训练集的差值矩阵
  •  
  •   # print(inputpoint);
  •   sqdiffmat = diffmat ** 2 #sqdiffmat 的数据类型是nump提供的ndarray,这不是矩阵的平方,而是每个元素变成原来的平方。
  •   sqdistances = sqdiffmat.sum(axis=1#计算每一行上元素的和
  •   # print(sqdistances);
  •   distances = sqdistances ** 0.5   #开方得到欧拉距离矩阵
  •   # print(distances);
  •   sorteddistindicies = distances.argsort() #按distances中元素进行升序排序后得到的对应下标的列表,argsort函数返回的是数组值从小到大的索引值
  •   # print(sorteddistindicies);
  •  
  •   # classcount数据类型是这样的{0: 2, 1: 2},字典key:value
  •   classcount = {}
  •   # 选择距离最小的k个点
  •   for i in range(k):
  •     voteilabel = labels[ sorteddistindicies[i] ]
  •     # print(voteilabel)
  •     # 类别数加1
  •     classcount[voteilabel] = classcount.get(voteilabel,0)+1
  •   print(classcount)# {1: 1, 7: 2}
  •   #按classcount字典的第2个元素(即类别出现的次数)从大到小排序
  •   sortedclasscount = sorted(classcount.items(), key = operator.itemgetter(1), reverse = true)
  •   print(sortedclasscount)# [(7, 2), (1, 1)]
  •   return sortedclasscount[0][0]
  •  
  • """
  • 描述:
  •   读取指定文件名的文本数据,构建一个矩阵
  • 参数:
  •   文本文件名称
  • 返回值:
  •   一个单行矩阵
  • """
  • def img2vector(filename):
  •  returnvect = []
  •  fr = open(filename)
  •  for i in range(32):
  •   linestr = fr.readline()
  •   for j in range(32):
  •    returnvect.append(int(linestr[j]))
  •  return returnvect
  •  
  • """
  • 描述:
  •   从文件名中解析分类数字,比如由0_0.txt得知这个文本代表的数字分类是0
  • 参数:
  •   文本文件名称
  • 返回值:
  •   一个代表分类的数字
  • """
  • def classnumcut(filename):
  •   filestr = filename.split('.')[0]
  •   classnumstr = int(filestr.split('_')[0])
  •   return classnumstr
  •  
  • """
  • 描述:
  •   构建训练集数据向量,及对应分类标签向量
  • 参数:
  •   
  • 返回值:
  •   hwlabels:分类标签矩阵
  •   trainingmat:训练数据集矩阵
  • """
  • def trainingdataset():
  •   hwlabels = []
  •   trainingfilelist = listdir('trainingdigits')   #获取目录内容
  •   m = len(trainingfilelist)
  •   # zeros返回全部是0的矩阵,参数是行和列
  •   trainingmat = zeros((m,1024))    #m维向量的训练集
  •   for i in range(m):
  •     # print (i);
  •     filenamestr = trainingfilelist[i]
  •     hwlabels.append(classnumcut(filenamestr))
  •     trainingmat[i,:] = img2vector('trainingdigits/%s' % filenamestr)
  •   return hwlabels,trainingmat
  •  
  • """
  • 描述:
  •   主函数,最终打印识别了多少个数字以及识别的错误率
  • 参数:
  •   
  • 返回值:
  •   
  • """
  • def handwritingtest():
  •   """
  •   hwlabels,trainingmat 是标签和训练数据,
  •   hwlabels 是一个一维矩阵,代表每个文本对应的标签(即文本所代表的数字类型)
  •   trainingmat是一个多维矩阵,每一行都代表一个文本的数据,每行有1024个数字(0或1)
  •   """
  •   hwlabels,trainingmat = trainingdataset() #构建训练集
  •   testfilelist = listdir('testdigits') #获取测试集
  •   errorcount = 0.0    #错误数
  •   mtest = len(testfilelist)    #测试集总样本数
  •   t1 = time.time()
  •   for i in range(mtest):
  •     filenamestr = testfilelist[i]
  •     classnumstr = classnumcut(filenamestr)
  •     # img2vector返回一个文本对应的一维矩阵,1024个0或者1
  •     vectorundertest = img2vector('testdigits/%s' % filenamestr)
  •     #调用knn算法进行测试
  •     classifierresult = classify(vectorundertest, trainingmat, hwlabels, 3)
  •     # 打印测试出来的结果和真正的结果,看看是否匹配
  •     print ("the classifier came back with: %d, the real answer is: %d" % (classifierresult, classnumstr))
  •     # 如果测试出来的值和原值不相等,errorcount+1
  •     if (classifierresult != classnumstr):
  •       errorcount += 1.0
  •   print("\nthe total number of tests is: %d" % mtest)   #输出测试总样本数
  •   print ("the total number of errors is: %d" % errorcount )  #输出测试错误样本数
  •   print ("the total error rate is: %f" % (errorcount/float(mtest))) #输出错误率
  •   t2 = time.time()
  •   print ("cost time: %.2fmin, %.4fs."%((t2-t1)//60,(t2-t1)%60) ) #测试耗时
  •  
  • """
  • 描述:
  •   指定handwritingtest()为主函数
  • """
  • if __name__ == "__main__":
  •  handwritingtest()
  • 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。

    原文链接:https://blog.csdn.net/yuzhiyun3536/article/details/84810194

    您可能感兴趣