原生Python實現KNN分類演算法

2021-09-28 14:23:16 字數 3723 閱讀 6218

原生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 計算測...