KNN演算法的Python源碼實現

KNN演算法的Python源碼實現

來自專欄 常用機器學習演算法實現與講解

1. 前言

KNN演算法的分類過程比較簡單,它不需要創建模型,也不需要進行訓練,並且非常容易理解。他的核心思想就是,要確定測試樣本屬於哪一類,就尋找所有訓練樣本中與該測試樣本「距離」最近的前K個樣本(就是最相似的K個樣本),然後看這K個樣本大部分屬於哪一類,那麼就認為這個測試樣本也屬於哪一類。簡單的說就是讓最相似的K個樣本來投票決定。

以下的鏈接講解了KNN的基本原理

鏈接: segmentfault.com/a/1190

建議閱讀順序:先閱讀源代碼,再來看源碼關鍵方法的講解,源碼地址RRdmlearning/Machine-Learning-From-Scratch

不知為何知乎上的代碼格式沒有原文章便於理解,大家可在cs229論壇社區|深度學習社區|機器學習社區|人工智慧社區上閱讀

2. 源碼講解

下面我簡單講解一下KNN的Python源碼實現

2.1.1 __init__():

def __init__(self,k=5): self.k = k

初始化超參數K

2.1.1 predict():

def predict(self, X_test, X_train, y_train): y_predict = np.zeros(X_test.shape[0]) for i in range(X_test.shape[0]): distances = np.zeros((X_train.shape[0], 2)) #測試的數據和訓練的各個數據的歐式距離 for j in range(X_train.shape[0]): dis = euclidean_distance(X_test[i], X_train[j]) #計算歐式距離 label = y_train[j] #測試集到的每個訓練集的數據的分類標籤 distances[j] = [dis, label] # argsort()得到測試集到訓練的各個數據的歐式距離從小到大排列並且得到序列,然後再取前k個. k_nearest_neighbors = distances[distances[:, 0].argsort()][:self.k] #利用np.bincount統計k個近鄰裡面各類別出現的次數 counts = np.bincount(k_nearest_neighbors[:, 1].astype(int)) #得出每個測試數據k個近鄰裡面各類別出現的次數最多的類別 testLabel = counts.argmax() y_predict[i] = testLabel return y_predict

預測函數,預測數據屬於那一類別,如果一個樣本在特徵空間中的 k 個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。

3. 源碼地址

鏈接 : github.com/RRdmlearning

直接運行knnExample.py即可


推薦閱讀:

TAG:k近鄰法 | 機器學習 | Python |