KNN手寫體數字識別

2021-10-09 23:26:34 字數 3782 閱讀 6942

思路:首先這是乙個通過knn分類來完成的數字識別,資料集的格式全部是經過處理後的32x32de1二進位制數字矩陣,把乙個樣本(32x32)轉化為1x1024的向量,即一行代表乙個樣本,然後把訓練樣本也轉化為乙個數字矩陣,每次輸入乙個測試集都與訓練集的矩陣進行作差,然後平方和開根號,最後將每乙個輸入的測試集進行比較,和哪個差值最小(即形狀最相似)即為哪一類(0~9)

''

'knn演算法實現手寫體數字識別'

''import numpy as np

from os import listdir

import operator

def img2vector

(filename):""

"實現將轉換為向量形式"

"" return_vector = np.

zeros((

1,1024))

fr =

open

(filename)

for i in range(32

):line = fr.

readline()

for j in range(32

):return_vector[0,

32*i + j]

=int

(line[j]

)return return_vector#in

x 用於分類的輸入向量

#data

set表示訓練樣本集

# 引數k表示選擇最近鄰居的數目

def classify0

(inx, data_set, labels, k):""

"實現knn"

"" diff_mat = inx - data_set # 各個屬性特徵做差

sq_diff_mat = diff_mat*

*2 # 各個差值求平方

sq_distances = sq_diff_mat.

sum(axis=

1) # 按行求和

distances = sq_distances*

*0.5 # 開方

sorted_dist_indicies = distances.

argsort

() # 按照從小到大排序,並輸出相應的索引值

class_count =

# 建立乙個字典,儲存k個距離中的不同標籤的數量

for i in range

(k):

vote_label = labels[sorted_dist_indicies[i]

] # 求出第i個標籤

# 訪問字典中值為vote_label標籤的數值再加1,

class_count[vote_label]

= class_count.

get(vote_label,0)

+1# 將獲取的k個近鄰的標籤類進行排序

#print

(class_count)

sorted_class_count =

sorted

(class_count.

items()

, key=operator.

itemgetter(1

), reverse=true)

# 標籤類最多的就是未知資料的類

return sorted_class_count[0]

[0]def hand_writing_class_test()

: hand_writing_labels =

# 手寫數字類別標籤

training_file_list =

listdir

('g:\\yjs\\datatra\\knn\\trainingdigits'

) # 獲得檔案中目錄列表,訓練資料集

m =len(training_file_list) # 求得檔案中目錄檔案個數(訓練資料集)

training_mat = np.

zeros

((m,

1024

)) # 建立訓練資料矩陣,特徵屬性矩陣

for i in range

(m):

file_name_str = training_file_list[i] # 獲取單個檔名

file_str = file_name_str.

split

(' ')[

0] # 將檔名中的空字元去掉,這裡的[

0]是將檔名取出來

class_num_str =

int(file_str.

split

('_')[

0]) # 取出數字類別

hand_writing_labels.

(class_num_str) # 將數字類別新增到類別標籤矩陣中

# 將影象格式轉換為向量形式

training_mat[i,:]

=img2vector

('g:\\yjs\\datatra\\knn\\trainingdigits\%s'

% file_name_str)

test_file_list =

listdir

('g:\\yjs\\datatra\\knn\\testdigits'

) # 獲得檔案中目錄列表,測試資料集

error_count =

0 # 錯誤分類個數

m_test =

len(test_file_list) # 測試資料集個數

for i in range

(m_test)

: file_name_str = test_file_list[i]

file_str = file_name_str.

split

('.')[

0]class_num_str =

int(file_str.

split

('_')[

0]) # 將影象格式轉換為向量形式(測試資料集)

vector_under_test =

img2vector

('g:\\yjs\\datatra\\knn\\testdigits\%s'

% file_name_str)

#knn分類,以測試資料集為未知資料,訓練資料為訓練資料

classifier_result =

classify0

(vector_under_test, training_mat, hand_writing_labels,3)

# 輸出分類結果和真實類別

print

('分類結果: %d, 真實結果: %d'

%(classifier_result, class_num_str)

) # 計算錯誤分類個數

if classifier_result != class_num_str:

error_count +=

1 # 輸出錯誤分類個數和錯誤率

print

("\n 錯誤分類個數 is: %d"

% error_count)

print

("\n 錯誤率: %f"

%(error_count/

float

(m_test)))

# 呼叫手寫識別

if __name__==

'__main__'

:hand_writing_class_test()

print

("--end--"

)

使用kNN實現手寫體識別

knn的總結 本質就是使用測試與樣本進行比較,找到k個最近的,在k個中選擇概率出現最高的那乙個,把數字記錄下來,這個數字就是最終目標。步驟如下 1 資料的載入。注意是隨機數的載入 有4組,分別為訓練資料,訓練標籤,測試,測試標籤 2 計算測試與訓練的距離 3 計算k個最近的 實際上就是排序 4 將得...

編寫knn演算法實現手寫體識別

knn演算法的核心思想是如果乙個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特性。該方法在確定分類決策上只依據最鄰近的乙個或者幾個樣本的類別來決定待分樣本所屬的類別。knn方法在類別決策時,只與極少量的相鄰樣本有關。由於knn方法主要靠周...

python使用KNN演算法手寫體識別

usr bin python coding utf 8 import numpy as np import operator import matplotlib import matplotlib.pyplot as plt import os knn演算法 1.計算已知類別資料集中的每個點依次執行...