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的...