K-nn手写数字识别--Python版
2017-12-13 13:54
399 查看
模式识别的实验作业,弄了一个晚上终于在第二天中午弄明白了!
简单来说,k-nn就是通过计算训练集和 一个测试数据之间的欧式距离,然后将计算结果按照从小到大来排序,找出最小的k个数据,分析k个数据中哪种情况出现的频率最多,那么这个测试数据就属于这一类
思路
读入数据,假设100个训练数据,将训练数据转换为100*1024的二维数组,然后循环读入测试数据,计算测试数据和100个训练数据间的欧式距离:
x1-xn为单个训练数据的所有元素,y1-yn为测试数据的所有元素
结果:
看的出正确率还挺高的
简单来说,k-nn就是通过计算训练集和 一个测试数据之间的欧式距离,然后将计算结果按照从小到大来排序,找出最小的k个数据,分析k个数据中哪种情况出现的频率最多,那么这个测试数据就属于这一类
思路
读入数据,假设100个训练数据,将训练数据转换为100*1024的二维数组,然后循环读入测试数据,计算测试数据和100个训练数据间的欧式距离:
x1-xn为单个训练数据的所有元素,y1-yn为测试数据的所有元素
这样就得到一个数组,包含所有训练数据和测试数据的欧式距离,将距离从小到大进行排序。
3. 结果
找出k个最近的距离,看哪个数字出现的频率最多,那么这个测试数据大概率为这个数字#解压文件 def JY(): path="/Users/fanjialiang2401/PycharmProjects/模式识别/digits.zip" newpath="/Users/fanjialiang2401/PycharmProjects/模式识别/" f=zipfile.ZipFile(path,'r') for file in f.namelist(): f.extract(file,newpath) print("success!") # 将32*32矩阵转换为一个长为1024的一位数字 def toVerctor(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; # 测试 trainlist为训练集所有数据,testdata为测试数据 classLable为 def Classfiy(Trainlist,testdata,classLable,k): listSize=len(Trainlist) diffs=[] for i in range(listSize): traindata=Trainlist[i]; diffvalue=np.sum(np.square(traindata-testdata)) diff=np.sqrt(diffvalue) diffs.append(diff) sortIndex=np.argsort(diffs) #sortIndex argsort对所有元素进行排序,返回的是序号值 num=[] for i in range(10): num.append(0) for i in range(k): num[int(classLable[sortIndex[i]])]+=1; # 找出出现频率最多的数 s=np.argsort(num) return s[9] #读取并且处理文件 相当于main方法 在这里调用其他方法 def Read(): hwlable=[] # 将读入的数据32*32转换为1024*length的数组 Trainlist=os.listdir('trainingDigits') length=len(Trainlist) trainMat=np.zeros((length,1024)) 97ab for i in range (length): # 读取文件名 filename=Trainlist[i] filestr=filename.split(".")[0] #通过字符串分割,得到数字 classNum=filestr.split('_')[0] hwlable.append(classNum) trainMat[i:]=toVerctor('trainingDigits/%s'%filename) # 测试集 # 测试文件 循环比较 testFileList=os.listdir('testDigits') errorCount=0; TestLength=len(testFileList) for i in range(TestLength): filenamestr=testFileList[i] filestr=filenamestr.split(".")[0] classStr=filestr.split("_")[0] # 测试向量 testVector=toVerctor('testDigits/%s'%filenamestr) lable=Classfiy(trainMat,testVector,hwlable,5) if lable!=int(classStr): errorCount+=1 print('false'+str(lable)+":"+classStr) print("正确个数:"+str(TestLength-errorCount)) print("正确率:"+str((TestLength-errorCount)/TestLength))
结果:
看的出正确率还挺高的
相关文章推荐
- Python做手写数字识别
- Caffe——Python接口学习(4):mnist实例——手写数字识别
- 机器学习(四):BP神经网络_手写数字识别_Python
- [Python]基于CNN的MNIST手写数字识别
- Python徒手实现识别手写数字—图像识别算法(K最近邻)
- Python实现knn算法手写数字识别
- 用BP人工神经网络识别手写数字——《Python也可以》之三
- python tensorflow 基于cnn实现手写数字识别
- Python(TensorFlow框架)实现手写数字识别系统
- Python实战 | TensorFlow之softmax的实现——手写数字识别
- SVM手写数字的识别---python
- 《神经网络与深度学习》第一章 使用神经网络来识别手写数字(三)- 用Python代码实现
- python实现基于SVM手写数字识别功能
- 用BP人工神经网络识别手写数字——《Python也可以》之三
- Python(TensorFlow框架)实现手写数字识别系统的方法
- ubuntu下caffe手写数字识别问题、python接口测试
- NN:神经网络算法进阶优化法,进一步提高手写数字识别的准确率—Jason niu
- Python 手写数字识别-knn算法应用
- 用BP人工神经网络识别手写数字——《Python也可以》之三
- mnsit 手写数据集 python3.x的读入 以及利用softmax回归进行数字识别