機器學習基礎 KNN實現手寫數字識別

2021-10-09 21:23:25 字數 4014 閱讀 6621

k-近鄰演算法是一種監督機器學習分類演算法。它的思想很簡單,計算測試點與樣本集合之間的歐幾里得距離(直線距離),找到測試點與樣本集合中距離最近的k個樣本集,這k個樣本集合中對應的最多的分類就可以作為測試點的分類。

本文使用的資料集, 解壓後的testdigits資料夾為測試檔案,trainingdigits為訓練檔案

文中的資料為畫素影象,儲存在txt檔案中。影象的畫素為32*32。

# 手寫數字識別

import numpy as np

import os

class

digitrecoginze()

:def

__init__

(self)

: self.label =

none

self.train_set =

none

self.test_set =

none

defimg2vector

(self, filename)

:# 將畫素影象轉化為向量

# 影象畫素為32*32

image_vector = np.zeros((1

,1024))

f =open

(filename,

'r')

for i in

range(32

):line = f.readline(

)for j in

range(32

):image_vector[0,

32*i + j]

=int

(line[j]

)return image_vector

defimport_data

(self,filepath)

:# 匯入資料

data_list = os.listdir(filepath)

data_list_number =

len(data_list)

# 匯入label資料

return_label = np.zeros(

(data_list_number,1)

)for i in

range

(data_list_number)

: return_label[i]

=(data_list[i]

.strip(

).split(

'_'))[

0]# 匯入data資料

return_data_set = np.zeros(

(data_list_number,

1024))

for i in

range

(data_list_number)

: return_data_set[i]

= self.img2vector(os.path.join(filepath, data_list[i]))

return return_data_set, return_label

deftrain_set_normalize

(self, train_set)

:# 歸一化

data_range = np.

max(train_set)

- np.

min(train_set)

return

(train_set - np.

min(train_set)

)/ data_range

defsingle_train

(self, train_set, testcase_x, train_label, k =5)

:# 計算距離

train_set_size = train_set.shape[0]

diff_mat = np.tile(testcase_x,

(train_set_size,1)

)- train_set

distances =

(diff_mat**2)

.sum

(axis=1)

**0.5

# print(distances)

# 排序,這裡排序結果表示他的排序位置

distances_sorted = distances.argsort(

) class_result =

# 找出k個點

for i in

range

(k):

now_label =

int(train_label[distances_sorted[i]][

0])# print(now_label)

class_result[now_label]

= class_result.get(now_label,0)

+1# 找出最近最多的點

max_num =

0 result_label =

0for single_result in class_result:

if class_result[single_result]

> max_num:

max_num = class_result[single_result]

result_label = single_result

return result_label

# 訓練

deftest

(self, train_set_filepath, test_set_filepath, k =5)

:# 匯入資料

train_set, train_label = self.import_data(train_set_filepath)

train_set = self.train_set_normalize(train_set)

test_set, test_label = self.import_data(test_set_filepath)

test_set = self.train_set_normalize(test_set)

error_number =

0 all_number = test_set.shape[0]

# 對於每乙個測試樣本進行測試

for i in

range

(all_number)

: result_label = self.single_train(train_set, test_set[i,:]

, train_label, k)

if result_label !=

int(test_label[i][0

]): error_number = error_number +

1print

("testcase %d: knn send back %d, the real class is %d"

%(i, result_label,

int(test_label[i][0

])))

print

("error ratio = %f"%(

float

(error_number)

/float

(all_number)))

# 資料位置修改為自己的

file_path_test = r'2020\ml\ml_action\1.knn\data\digit\testdigits'

file_path_train = r'2020\ml\ml_action\1.knn\data\digit\trainingdigits'

_dr = digitrecoginze(

)_dr.test(file_path_train,file_path_test)

參考文獻:

機器學習(二) kNN手寫數字識別

一 knn演算法 1 knn演算法是機器學習的入門演算法,其中不涉及訓練,主要思想是計算待測點和參照點的距離,選取距離較近的參照點的類別作為待測點的的類別。2,距離可以是歐式距離,夾角余弦距離等等。3,k值不能選擇太大或太小,k值含義,是最後選取距離最近的前k個參照點的類標,統計次數最多的記為待測點...

機器學習案例 基於KNN手寫數字識別

演算法介紹 之前已經介紹過,簡單來說,k nn可以看成 有那麼一堆你已經知道分類的資料,然後當乙個新資料進入的時候,就開始跟訓練資料裡的每個點求距離,然後挑離這個訓練資料最近的k個點看看這幾個點屬於什麼型別,然後用少數服從多數的原則,給新資料歸類。演算法步驟 演算法步驟 step.1 初始化距離為最...

機器學習 手寫數字識別(KNN 決策樹)

knn 及決策樹演算法為監督學習中的兩種簡單演算法。knn演算法 鄰近演算法 的核心思想是如果乙個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特性。歐式距離的計算公式 假設每個樣本有兩個特徵值,如 a a1,b1 b a2,b2 則ab的...