KNN算法系列课程在这:
1.掌握sorted函数key用法
sortedClassCount = sorted(classCount.items(), key = operator.itemgetter(1),reverse = True)
2.掌握os.dir()用法
trainingFileList = os.listdir(‘digits/trainingDigits’)
3.理解到kNN为什么垃圾
手写识别系统
1.这里构造的系统只能识别0-9,且图像已经处理成相同大小32x32,要是320x320我估计我的笔记本要吐血!现在的机器学习好像还不可以随便识别训练任意图像
2.为了方便,这里我们把图像转换为了文本格式,32x32展开,就是1x1024的向量,如果需要文件,
3.百度找找机器学习实践
源文件就可以了,我不负责提供这些,嗯…还是提供好了,文本文件在这!点一下就可以了失效记得说。
好了,那我们开始吧
import numpy as np
import operator
import os
# 1.32x32转化为向量
def img2vector(filename):
returnVect = np.zeros((1,1024))
fr =open(filename)
for i in range(32):
# 每次读取一行
lineStr = fr.readline()
#将每一行的每一个元素写入到向量中
for j in range(32):
returnVect[0,32*i+j]=int(lineStr[j])
return returnVect
# 先测试一下吧
testVector = img2vector('digits/testDigits/0_13.txt')
print(testVector[0,0:31])
# >>[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1. 1. 0. 0. 0. 0. 0. 0.
# 0. 0. 0. 0. 0. 0. 0.]
# 看来已经读取好了
# 这是分类器
def classify0(inX,dataSet,labels,k):
dataSetSize = dataSet.shape[0] #取第一个维度,计算样本的个数
diffMat = np.tile(inX,(dataSetSize,1)) - dataSet
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
#argsort()是将元素从小到大排列,提取其对应的index(索引),然后输出
sortedDisIndicies = distances.argsort()
#创建一个dict
classCount ={}
for i in range(k):
#获得距离最小前K个的标签
voteIlabel = labels[sortedDisIndicies[i]]
# dict.get(key, default=None)函数,key就是dict中的键voteIlabel,
# 如果不存在则返回一个0并存入dict,如果存在则读取当前值并 + 1;
# 这样操作后我们可能得到{'A':1,'B':1,'A':1}
classCount[voteIlabel] = classCount.get(voteIlabel,0) +1
sortedClassCount = sorted(classCount.items(),\
key = operator.itemgetter(1),reverse = True)
return sortedClassCount[0][0]
# 2.测试分类器
def handwritingClassTest():
hwLabels=[]
# os.listdir可以列出给定目录的文件名
#返回4_135.txt','4_136.txt', '4_137.txt',这样目的是为了做Label呢
#我们现在只有提取每一行第一个数字,就是其对应的Label了
trainingFileList = os.listdir('digits/trainingDigits')
m =len(trainingFileList)# 这里我们有1934个样本
trainingMat = np.zeros((m,1024))
for i in range(m):
fileNameStr = trainingFileList[i]
fileStr = fileNameStr.split('.')[0] #提取出4_139
classNumStr = int(fileStr.split('_')[0])#提取出0-9
hwLabels.append(classNumStr)#Label制作完成
trainingMat[i,:] = img2vector('digits/trainingDigits/%s'%(fileNameStr))
testFileList =os.listdir('digits/testDigits')
errorCount = 0.0
mTest = len(testFileList)
for i in range(mTest):
fileNameStr = testFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
vectorUnderTest = img2vector('digits/testDigits/%s'%(fileNameStr))
classifierResult = classify0(vectorUnderTest,trainingMat,hwLabels,3)
print('the classifier came back with:%d,the real answer is:%d'\
%(classifierResult,classNumStr))
if (classifierResult !=classNumStr):
errorCount+=1.0
print('\n the total number of errors is:%d'%errorCount)
print('\n the total error rates is %f'%(errorCount/float(mTest)))
#好了,已经写完了,下面进行验证吧
handwritingClassTest()
'''
the total number of errors is:10
the total error rates is 0.010571
'''
马上我们就可以看出弊端了,kNN严格上是一种傻瓜的做法,没有训练过程,仅仅是简单的比较,然而在实际过程中是无法满足的,这使得我们不得不放弃这一种方法。在以后如果我们拿5万的图像来跑的时候,会发现正确率是很低的(29%)。对于图像,唯一办法就是深度学习喽……
好了,今天介绍,就到这里,KNN的介绍已经很多了,下一节我们来学习决策树!!
加油!你是最’胖’的!!!