原生python實現knn分類演算法,用鳶尾花資料集。
knn是一種聚類演算法,用於對新的資料點進行分類。對於乙個只知道特徵的資料點,首先計算它和已知訓練集所有點的距離,然後選擇最近的k個點進行「投票表決」來決定所屬型別。因為訓練集的標籤是已知的,所以根據「投票」結果,判定該點的型別為「票數」最多的類別。例如在k=3,即選擇最近的3個點進行判別時,其屬於三角形一類;k=5時,其屬於五邊形一類。當然,這也就涉及k的選擇問題,一般使用交叉驗證法確定最優的k值。如圖所示:
特例:k=1時,可以將訓練的模型成為最鄰近分類器。
通過呼叫sklearn庫應用此演算法可知:只要模仿新建乙個類,幷包含fit和predict方法即可。
首先實現如何呼叫sklearn庫來實現knn演算法,然後按照同樣的流程逐步深入演算法的各個部分,最後完成手動實現。每個函式的具體實現說明如下:
可以接受兩個引數,分別是訓練集的特徵和標籤。由於knn演算法沒有顯示訓練過程(在訓練集進入時才開始計算並分類),所以這裡只需要將訓練集匯入類變數即可。
def fit(self, x_train, y_train):
self.x_train = x_train
self.y_train = y_train
此函式的返回值時**結果,所以建立乙個列表來存放所有的類別結果,該列表就是predictions。之後,只需要遍歷每乙個測試集裡邊的特徵值資料,並選取距離最近的點(此時設k=1)的類別作為判別的結果,並將其加入predictions即可。
def predict(self, x_test):
predictions =
for row in x_test:
# label = random.choice(self.y_train)
label = self.closest(row)
return predictions
找到離輸入的資料點最近的乙個點,並將此最近點的類別作為該點類別的**值返回。首先將測試點與訓練集第乙個資料點的距離設為初始最小距離,並將第乙個點設為初始最鄰近的點。之後,遍歷訓練集的每乙個點,只要距離比之前的點小,就更新最短距離,並更新其所屬類別(通過記錄索引值來記錄其類別)。那麼在遍歷完訓練集所有點之後,此時best_dist必時最小的,其對應的類別就是y_train[best_index]。
def closest(self,row):
best_dist = self.euc(row, self.x_train[0])
best_index = 0
for i in range(len(x_train)):
dist = self.euc(row, self.x_train[i])
if dist < best_dist:
best_dist = dist
best_index = i
return self.y_train[best_index]
計算資料點之間的距離。這裡的距離函式,選用了歐式距離。
def euc(self, a, b):
return distance.euclidean(a, b)
import numpy as np
import operator
from scipy.spatial import distance
def fit(self, x_train, y_train, k):
self.x_train = x_train
self.y_train = y_train
self.k = k
def predict(self, x_test):
predictions =
for row in x_test:
label = self.closest_k(row)
return predictions
def closest_k(self, row):
# distances 儲存測試點到資料集各個點的距離
distances =
for i in range(len(x_train)):
dist = self.euc(row, self.x_train[i])
# 轉換成陣列,對距離排序(從小到大),返回位置資訊
distances = np.array(distances)
sorteddistindicies = distances.argsort()
classcount = {}
for i in range(self.k):
voteilabel = y_train[sorteddistindicies[i]]
# 此處 get,原字典有此 voteilabel 則返回其對應的值,沒有則返回0
classcount[voteilabel] = classcount.get(voteilabel, 0) + 1
# 根據值(對應「票數」)進行排序,使得獲得票數多的類在前(故使用reverse = true)
sortedclasscount = sorted(classcount.items(), key = operator.itemgetter(1), reverse = true)
# 返回該測試點的類別
return sortedclasscount[0][0]
# 計算歐式距離
k近鄰演算法中k的含義是:我們可以考慮訓練集中與新資料點最近的任意k個鄰居,而不是只考慮最近的乙個。
至此,已經完成了手動實現聚類演算法。對於乙個演算法,如果只會呼叫的話,就好比黑盒一樣,不知道原理,用起來自然不會很放心。而經過自己的實現,對其內部的機制就十分清楚了,對之後的呼叫甚至優化演算法都有很大的幫助。
原生python實現knn分類演算法
一 題目 原生python實現knn分類演算法 二 演算法設計 k 近鄰 k nearset neighbor,簡稱 knn 學習是一種常用的監督學習方法,其工作機制非常簡單 給定測試樣本,基於某種距離度量找出訓練集中與其最靠近的 k 個訓練樣本,然後基於這 k 個 鄰居 的資訊來進行觀測。通常,在...
原生python實現knn分類演算法,用鳶尾花資料集
1.作業題目 原生python實現knn分類演算法,用鳶尾花資料集 2.演算法設計 knn演算法設計思路 演算法涉及3個主要因素 訓練資料集 距離或相似度的計算衡量 k的大小 對於確定未知類別 1.計算已知類別資料集中的點與當前點的距離 距離的計算一般使用歐氏距離或曼哈頓距離 2.按照距離依次排序 ...
原生python實現knn演算法
1 knn演算法的思想 就是在訓練集中資料和標籤已知的情況下,輸入測試資料,將測試資料的特徵與訓練集中對應的特徵進行相互比較,找到訓練集中與之最為相似的前k個資料,則該測試資料對應的類別就是k個資料 現次數最多的那個分類。2 演算法設計 根據knn演算法的思想可以得到knn演算法的步驟為 1 計算測...