需要兩個資料報,裡邊有許多數字影象,像這樣:
資料報
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...
手寫數字識別系統之傾斜矯正
傾斜校正主要有兩種,一種是整體傾斜校正,另一種是區域性傾斜校正。由於本文主要研究具有不規則分布的多數字識別,因此只需要關注經過提取後的數字校正問題,也就是影象的區域性校正。目前的校正演算法有很多,比如說 對於整體傾斜校正可以採用統計影象左右兩邊的平均畫素高度,通過計算整體傾斜度來進行校正。這種方法對...
手寫數字識別系統之傾斜矯正
傾斜校正主要有兩種,一種是整體傾斜校正,另一種是區域性傾斜校正。由於本文主要研究具有不規則分布的多數字識別,因此只需要關注經過提取後的數字校正問題,也就是影象的區域性校正。目前的校正演算法有很多,比如說 對於整體傾斜校正可以採用統計影象左右兩邊的平均畫素高度,通過計算整體傾斜度來進行校正。這種方法對...