機器學習 手寫數字識別系統

2021-09-25 07:04:10 字數 3026 閱讀 3543

需要兩個資料報,裡邊有許多數字影象,像這樣:

資料報

import numpy as np

import operator

from os import listdir

"""分類函式"""

def classfy0(inx, dataset, labels, k): # 引數分別為測試樣本,訓練樣本,訓練樣本標籤,近鄰個數

datasetsize = dataset.shape[0] # 返回行列數,0為行,列為1

diffmat = np.tile(inx, (datasetsize, 1)) - dataset # tile是按照某個方向複製元素,行方向複製四行,列方向複製一行,然後減去每個訓練樣本值

sqdiffmat = diffmat ** 2 # 乘方運算

sqdistances = sqdiffmat.sum(axis=1) # 軸為1的方向(橫向)求和

distances = sqdistances ** 0.5 # 乘方運算,等同於開根號

sorteddistindicies = distances.argsort() # 返回從小到大排序的索引值(原陣列不動)

classcount = {} # 字典(鍵值對)

for i in range(k): # for-each迴圈,統計前k個每個分類有多少個

voteilabel = labels[sorteddistindicies[i]] # 記錄每個的標籤

classcount[voteilabel] = classcount.get(voteilabel, 0) + 1 # 取出該標籤的值+1(原先沒有預設為0)

sortedclasscount = sorted(classcount.items(), key=operator.itemgetter(1),

reverse=true) # operator.itemgetter(1)表示用鍵值對中的值排序,為0表示用鍵排序,一開始公升序,reverse=true後降序

return sortedclasscount[0][0] # 返回第乙個標籤

"""32*32矩陣->1*1024矩陣"""

def im**ector(filename):

returnvect = np.zeros((1, 1024)) # 建立1*1024矩陣,用0填充

fr = open(filename) # 開啟檔案

for i in range(32):

linestr = fr.readline() # 按行讀取

for j in range(32):

returnvect[0, 32 * i + j] = int(linestr[j]) # 每一行的32個元素依次新增到1*1024的矩陣中

return returnvect

"""處理檔案"""

def handwritingclasstest():

hwlabels = # 測試機標籤

trainingfilelist = listdir('trainingdigits') # 返回trainingdigits目錄下的檔名,如:0_0.txt

m = len(trainingfilelist) # 求檔名個數

trainingmat = np.zeros((m, 1024)) # 因為每個檔案都對應乙個1*1024的矩陣,所以建立乙個m*1024的矩陣

for i in range(m):

filenamestr = trainingfilelist[i] # 依次取每乙個檔案名字

filestr = filenamestr.split('.')[0] # 以原點分開,並且取前邊的(去掉字尾)如:0_0

classnumstr = int(filestr.split('_')[0]) # 獲得檔案名字前邊的數字,如:0

trainingmat[i, :] = im**ector('trainingdigits/%s' % filenamestr) # 將每乙個檔案轉換成1*1024的矩陣

testfilelist = listdir('testdigits') # 返回testfilelist目錄下的檔名,如:0_0.txt

errorcount = 0.0

mtest = len(testfilelist) # 測試檔案數

for i in range(mtest):

filenamestr = testfilelist[i]

filestr = filenamestr.split('.')[0]

classnumstr = int(filestr.split('_')[0])

vectorundertest = im**ector('testdigits/%s' % filenamestr) # 取每乙個檔案的1*1024矩陣

classifierresult = classfy0(vectorundertest, trainingmat, hwlabels, 3) # 進行分類

kNN實現手寫數字識別系統

總結 from numpy import import operator from os import listdir import numpy as np 向量化,對每個32 32的數字向量化為1 1024 def img2vector filename returnvect zeros 1,10...

手寫數字識別系統之傾斜矯正

傾斜校正主要有兩種,一種是整體傾斜校正,另一種是區域性傾斜校正。由於本文主要研究具有不規則分布的多數字識別,因此只需要關注經過提取後的數字校正問題,也就是影象的區域性校正。目前的校正演算法有很多,比如說 對於整體傾斜校正可以採用統計影象左右兩邊的平均畫素高度,通過計算整體傾斜度來進行校正。這種方法對...

手寫數字識別系統之傾斜矯正

傾斜校正主要有兩種,一種是整體傾斜校正,另一種是區域性傾斜校正。由於本文主要研究具有不規則分布的多數字識別,因此只需要關注經過提取後的數字校正問題,也就是影象的區域性校正。目前的校正演算法有很多,比如說 對於整體傾斜校正可以採用統計影象左右兩邊的平均畫素高度,通過計算整體傾斜度來進行校正。這種方法對...