Machine Learning in Action_CH2_3_使用kNN手写数字识别
2017-04-27 15:48
399 查看
from numpy import * import operator from os import listdir # kNN def classify0(inX, dataSet, labels, k): dataSetSize = dataSet.shape[0] # 获得向量第一维长度 diffMat = tile(inX, (dataSetSize, 1)) - dataSet # 纵向扩大dataSetSize倍 sqDiffMat = diffMat ** 2 sqDistances = sqDiffMat.sum(axis = 1) # 按行求和 distances = sqDistances ** 0.5 sortedDistIndicies = distances.argsort() # 从小到大排序,返回的是索引值的列表 classCount = {} # python字典 for i in range(k): voteIlabel = labels[sortedDistIndicies[i]] classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 # 数频度,每次加1 # 对字典进行排序 # Python 2 才能使用classCount.iteritems() sortedClassCount = sorted(classCount.items(), key = operator.itemgetter(1), reverse = True) return sortedClassCount[0][0] # 将32*32二进制图像矩阵转换为1*1024的向量 def img2vector(filename): fr = open(filename) returnVect = zeros((1, 1024)) for i in range(32): # 每次读一行 lineStr = fr.readline() # 错误 # returnVect[32 * i, 32 * (i + 1)] = lineStr[0 : 32] for j in range(32): returnVect[0, 32 * i + j] = int(lineStr[j]) # 要强转为int类型,所以不能列表整体赋值 return returnVect # 手写数字识别系统 def handwritingClassTest(): hwLabels = [] trainingFileList = listdir('trainingDigits') # 得到一个列表 m = len(trainingFileList) trainingMat = zeros((m, 1024)) for i in range(m): fileNameStr = trainingFileList[i] fileStr = fileNameStr.split('.')[0] # 将文件名截断 classNameStr = int(fileStr.split('_')[0]) hwLabels.append(classNameStr) trainingMat[i, :] = img2vector('trainingDigits/%s' % fileNameStr) errorCount = 0.0 testFileList = listdir('testDigits') mTest = len(testFileList) for i in range(mTest): fileNameStr = testFileList[i] fileStr = fileNameStr.split('.')[0] classNameStr = int(fileStr.split('_')[0]) vectorUnderTest = img2vector('testDigits/%s' % fileNameStr) # k=4时,errorrate=0.014799 classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3) print("the classifier came back with: %d, the real answer is: %d" % (classifierResult, classNameStr)) if(classifierResult != classNameStr): errorCount += 1.0 print("the total number of errors is: %d" % errorCount) print("the total error rate is: %f" % (errorCount / float(mTest))) if __name__ == "__main__": # 测试img2vector函数 testVector = img2vector('testDigits/0_0.txt') print(testVector[0, 0 : 32]) print(testVector[0, 32 : 64]) # 测试 print("-------------测试开始--------------") handwritingClassTest()
相关文章推荐
- 使用KNN算法在python下识别手写数字(带注释)
- 使用PCA + KNN对MNIST数据集进行手写数字识别 python
- 使用Knn算法实现手写数字识别系统(附带jpg转txt代码)
- 使用kNN算法识别手写数字
- 《机器学习实战》代码记录--knn--手写数字识别
- 使用OPENCV训练手写数字识别分类器
- 基于KNN的手写数字识别
- 《神经网络与深度学习》第一章 使用神经网络来识别手写数字(三)- 用Python代码实现
- opencv+KNN实现手写简单数字识别
- 机器学习(3)——KNN算法及手写数字的识别(一)
- C++使用matlab卷积神经网络库MatConvNet来进行手写数字识别
- MachineLearning— (KNN)k Nearest Neighbor实现手写数字识别(三)
- 在Kaggle手写数字数据集上使用Spark MLlib的RandomForest进行手写数字识别
- Tensorflow的Helloword:使用简单Softmax Regression模型来识别Mnist手写数字
- 机器学习实战k近邻算法(kNN)应用之手写数字识别代码解读
- Matlab实现手写数字识别(PCA+KNN)
- 《神经网络和深度学习》系列文章一:使用神经网络识别手写数字
- 机器学习-KNN算法应用-手写数字识别( hand-written digits)
- opencv实现KNN手写数字的识别
- opencv 基于KNN的手写数字字符识别