python使用KNN算法識別手寫數(shù)字
本文實(shí)例為大家分享了python使用KNN算法識別手寫數(shù)字的具體代碼,供大家參考,具體內(nèi)容如下
# -*- coding: utf-8 -*-
#pip install numpy
import os
import os.path
from numpy import *
import operator
import time
from os import listdir
"""
描述:
KNN算法實(shí)現(xiàn)分類器
參數(shù):
inputPoint:測試集
dataSet:訓(xùn)練集
labels:類別標(biāo)簽
k:K個鄰居
返回值:
該測試數(shù)據(jù)的類別
"""
def classify(inputPoint,dataSet,labels,k):
dataSetSize = dataSet.shape[0] #已知分類的數(shù)據(jù)集(訓(xùn)練集)的行數(shù)
#先tile函數(shù)將輸入點(diǎn)拓展成與訓(xùn)練集相同維數(shù)的矩陣,再計(jì)算歐氏距離
diffMat = tile(inputPoint,(dataSetSize,1))-dataSet #樣本與訓(xùn)練集的差值矩陣
# print(inputPoint);
sqDiffMat = diffMat ** 2 #sqDiffMat 的數(shù)據(jù)類型是nump提供的ndarray,這不是矩陣的平方,而是每個元素變成原來的平方。
sqDistances = sqDiffMat.sum(axis=1) #計(jì)算每一行上元素的和
# print(sqDistances);
distances = sqDistances ** 0.5 #開方得到歐拉距離矩陣
# print(distances);
sortedDistIndicies = distances.argsort() #按distances中元素進(jìn)行升序排序后得到的對應(yīng)下標(biāo)的列表,argsort函數(shù)返回的是數(shù)組值從小到大的索引值
# print(sortedDistIndicies);
# classCount數(shù)據(jù)類型是這樣的{0: 2, 1: 2},字典key:value
classCount = {}
# 選擇距離最小的k個點(diǎn)
for i in range(k):
voteIlabel = labels[ sortedDistIndicies[i] ]
# print(voteIlabel)
# 類別數(shù)加1
classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
print(classCount)# {1: 1, 7: 2}
#按classCount字典的第2個元素(即類別出現(xiàn)的次數(shù))從大到小排序
sortedClassCount = sorted(classCount.items(), key = operator.itemgetter(1), reverse = True)
print(sortedClassCount)# [(7, 2), (1, 1)]
return sortedClassCount[0][0]
"""
描述:
讀取指定文件名的文本數(shù)據(jù),構(gòu)建一個矩陣
參數(shù):
文本文件名稱
返回值:
一個單行矩陣
"""
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
"""
描述:
從文件名中解析分類數(shù)字,比如由0_0.txt得知這個文本代表的數(shù)字分類是0
參數(shù):
文本文件名稱
返回值:
一個代表分類的數(shù)字
"""
def classnumCut(fileName):
fileStr = fileName.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
return classNumStr
"""
描述:
構(gòu)建訓(xùn)練集數(shù)據(jù)向量,及對應(yīng)分類標(biāo)簽向量
參數(shù):
無
返回值:
hwLabels:分類標(biāo)簽矩陣
trainingMat:訓(xùn)練數(shù)據(jù)集矩陣
"""
def trainingDataSet():
hwLabels = []
trainingFileList = listdir('trainingDigits') #獲取目錄內(nèi)容
m = len(trainingFileList)
# zeros返回全部是0的矩陣,參數(shù)是行和列
trainingMat = zeros((m,1024)) #m維向量的訓(xùn)練集
for i in range(m):
# print (i);
fileNameStr = trainingFileList[i]
hwLabels.append(classnumCut(fileNameStr))
trainingMat[i,:] = img2vector('trainingDigits/%s' % fileNameStr)
return hwLabels,trainingMat
"""
描述:
主函數(shù),最終打印識別了多少個數(shù)字以及識別的錯誤率
參數(shù):
無
返回值:
無
"""
def handwritingTest():
"""
hwLabels,trainingMat 是標(biāo)簽和訓(xùn)練數(shù)據(jù),
hwLabels 是一個一維矩陣,代表每個文本對應(yīng)的標(biāo)簽(即文本所代表的數(shù)字類型)
trainingMat是一個多維矩陣,每一行都代表一個文本的數(shù)據(jù),每行有1024個數(shù)字(0或1)
"""
hwLabels,trainingMat = trainingDataSet() #構(gòu)建訓(xùn)練集
testFileList = listdir('testDigits') #獲取測試集
errorCount = 0.0 #錯誤數(shù)
mTest = len(testFileList) #測試集總樣本數(shù)
t1 = time.time()
for i in range(mTest):
fileNameStr = testFileList[i]
classNumStr = classnumCut(fileNameStr)
# img2vector返回一個文本對應(yīng)的一維矩陣,1024個0或者1
vectorUnderTest = img2vector('testDigits/%s' % fileNameStr)
#調(diào)用knn算法進(jìn)行測試
classifierResult = classify(vectorUnderTest, trainingMat, hwLabels, 3)
# 打印測試出來的結(jié)果和真正的結(jié)果,看看是否匹配
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) #輸出測試總樣本數(shù)
print ("the total number of errors is: %d" % errorCount ) #輸出測試錯誤樣本數(shù)
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()為主函數(shù)
"""
if __name__ == "__main__":
handwritingTest()
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
利用PyQt5中QLabel組件實(shí)現(xiàn)亞克力磨砂效果
Windows10 在 UWP 應(yīng)用中支持亞克力畫刷,可以在部件的底部繪制亞克力效果的背景圖。本文將使用QLabel來模擬這個磨砂過程,感興趣的可以了解一下2022-03-03
使用TensorFlow直接獲取處理MNIST數(shù)據(jù)方式
今天小編就為大家分享一篇使用TensorFlow直接獲取處理MNIST數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
全網(wǎng)最簡約的Anaconda+Python3.7安裝教程Win10
這篇文章主要介紹了全網(wǎng)最簡約的Anaconda+Python3.7安裝教程Win10,圖文講解全流程安裝方法,還不會的小伙伴快來看看吧2023-03-03
python seaborn heatmap可視化相關(guān)性矩陣實(shí)例
這篇文章主要介紹了python seaborn heatmap可視化相關(guān)性矩陣實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
Python中利用aiohttp制作異步爬蟲及簡單應(yīng)用
asyncio可以實(shí)現(xiàn)單線程并發(fā)IO操作,是Python中常用的異步處理模塊。這篇文章主要介紹了Python中利用aiohttp制作異步爬蟲的相關(guān)知識,需要的朋友可以參考下2018-11-11
端午節(jié)將至,用Python爬取粽子數(shù)據(jù)并可視化,看看網(wǎng)友喜歡哪種粽子吧!
端午節(jié)快要到了,旅游?回家?拜訪親友?少不了要帶上粽子.那么:選擇什么牌子的粽子呢?選擇什么口味的粽子呢?選擇什么價格區(qū)間呢?今天爬取了京東上面的 “粽子數(shù)據(jù)” 進(jìn)行分析,看看有啥發(fā)現(xiàn)吧!,需要的朋友可以參考下2021-06-06
使用python批量化音樂文件格式轉(zhuǎn)換的實(shí)例
今天小編就為大家分享一篇使用python批量化音樂文件格式轉(zhuǎn)換的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01
PyTorch實(shí)現(xiàn)ResNet50、ResNet101和ResNet152示例
今天小編就為大家分享一篇PyTorch實(shí)現(xiàn)ResNet50、ResNet101和ResNet152示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01

