本文不涉及k-近鄰演算法的原理,只通過python**實現演算法,並且沒有用到機器學習庫,根據演算法流程一步一步實現。
假設我們已經獲取了資料及其標籤的文字檔案,如下圖所示。
資料有3個屬性,標籤分為3個型別,。python讀取資料
# 讀取資料並記錄
defreadfile
(filename)
:file
=open
(filename)
# 開啟檔案
lines =
file
.readlines(
)# 讀取每行資料
num =
len(lines)
# 資料的數量
x_data = np.zeros(
(num,3)
)# 準備儲存資料特徵矩陣
x_label =
# 準備儲存資料標籤
index =
0for line in lines:
line = line.strip(
)# 丟棄資料後的換行
list
= line.split(
'\t'
)# 資料分隔
x_data[index,:]
=list[0
:3]# 儲存資料特徵
int(
list[-
1]))
# 儲存標籤
index +=
1return x_data, x_label
讀取資料之後,對特徵進行歸一化處理
# 特徵歸一化
defnorm
(data)
:min
= data.
min(0)
# 獲取每個特徵最小值
max= data.
max(0)
# 每個特徵最大值
ranges =
max-
min# 每個特徵極差
normdata = np.zeros(np.shape(data)
)# 準備儲存歸一化後的特徵
m = data.shape[0]
# 獲取資料的數量
normdata = data - np.tile(
min,
(m,1))
# 將最小值擴充套件成為矩陣的形式,大小與data相同,並相減
normdata = normdata / np.tile(ranges,
(m,1))
# 將極差擴充套件成為矩陣的形式,大小與data相同,並相除
knn分類器
# knn分類
defclassify
(x_data, x_label, y_data, k)
: num = x_data.shape[0]
# 訓練資料的數量
y = np.tile(y_data,
(num,1)
)- x_data # 測試資料擴充套件為訓練資料大小相同的矩陣形式,並相減
y2 = y **
2# 計算平方
distances =
(y2.
sum(axis=1)
)**0.5# 計算距離
sorteddisindex = distances.argsort(
)# 排序,並獲得索引
classcount =
# 前k個標籤
for i in
range
(k):
vote = x_label[sorteddisindex[i]
]# 第i個標籤
classcount[vote]
= classcount.get(vote,0)
+1# 標籤數量加1
sortedclasscount =
sorted
(classcount.items(),
key=operator.itemgetter(1)
, reverse=
true
)# 標籤數量排序
return sortedclasscount[0][0]
選取10%的資料用於測試
# 測試
deftest()
: ratio =
0.10
# 0.1的資料用於測試
x_data, x_label = readfile(
'set.txt'
)# 讀取資料
normdata, ranges, minvals = norm(x_data)
# 特徵歸一化
num = normdata.shape[0]
# 資料數量
numtest =
int(num * ratio)
# 測試資料數量
errorcount =
0.0for i in
range
(numtest)
: result = classify(normdata[numtest: num,:]
, x_label[numtest: num]
, normdata[i,:]
,3)# 分類
print
("分類結果: %d, 實際結果: %d"
%(result, x_label[i]))
if(result != x_label[i]
): errorcount +=
1.0print
("錯誤率: %f"
%(errorcount /
float
(numtest)))
print
(errorcount)
最後通過執行test()
函式即可進行測試。如果有新的資料,執行classify()
函式獲得分類結果。 k近鄰演算法 python實現
k近鄰演算法 k nearest neighbor,knn 是一種非常直觀的,易於理解的有監督的演算法 對於乙個待分類的樣本,在已知的樣本集合中尋 找與它距離最近的k個樣本,及所謂的k近鄰。通過這這k個近鄰的所述類別來決定分類結果。距離度量距離度量方法有很多種,例如 歐式距離 曼哈頓距離 切比雪夫距...
k近鄰演算法 python實現
特徵距離計算 距離計算方法有很多,這裡先列三種 簡單例子 電影型別 根據歐氏距離計算公式,算出未知電影與已知電影型別之間的距離。電影名稱 打鬥鏡頭 接吻鏡頭 電影型別 歐式距離13 104愛情片 20.522 100愛情片 18.731 81愛情片 19.2 4101 10動作片 115.3599 ...
K近鄰演算法 python實現
k近鄰演算法 演算法原理 將資料轉換成向量形式 計算輸入向量與樣本中的距離 比如歐式距離等 對距離計算結果排序 取前k個 根據指定規則 多數或者按照一定權重進行計算 確定輸入向量類別。python實現 import numpy as np import operator class knnmetho...