K最近鄰算法


一、原理
        K最近鄰算法(K-Nearest Neighbor, KNN)是最基本的分類算法,其基本原理是:從最近的K個鄰居(樣本)中,選擇出現次數最多的類別作為判定類別。K最近鄰算法可以理解為是一個分類算法,常用於標簽的預測,如性別。

實現KNN算法核心的一般思路:

  1. 相似度計算——計算未知樣本和每個訓練樣本的距離;
  2. 排序——按照距離的遞增關系排序;
  3. 統計標簽——得到距離最小的前K個樣本,統計K最近鄰樣本中每個樣本出現的次數;
  4. 預測標簽——選擇出現頻率最高的類標號作為未知樣本的類標號;

        K值的選擇是選擇統計的樣本數量,K值得選擇會對KNN算法產生較大得影響。

  • 如果K值較小,則意味着:只有當需要進行預測的樣本和訓練的樣本較接近時,才能有較好的效果;
  • 如果K值較大,則意味着:算法分類的近似誤差增大。這時,與輸入樣本距離較遠的樣本也會對結果產生作用。

在實際上,K值一般選擇較小的數,也可以選擇交叉驗證的方法尋找最優K值。
二、實例Python實現

利用KNN算法實現性別判定:很多時候,用戶在注冊的時候,沒有填寫性別,這個時候,可以通過KNN預測。

import numpy as np class KNN: def __init__(self, k): self.k = k def createData(self): features = np.array([[180,76],[158,43],[176,78],[161,49]]) labels = ["","","",""] return features, labels def Normalization(self, data): # print("data:\n",data)
        maxs = np.max(data, axis=0) # print("maxs:\n",maxs)
        mins = np.min(data, axis=0) # print("mins\n",mins)
        new_data = (data - mins) / (maxs - mins) # print("new_data:\n",new_data)
        return new_data, maxs, mins def classify(self, one, data, labels): # 計算新樣本與數據集每個樣本之間的距離,這里采用歐式距離
        differenceData = data - one squareData = (differenceData ** 2).sum(axis=1) distance = squareData ** 0.5
        # 從小到大排序
        sortDistanceIndex = distance.argsort() labelCount = dict() for i in range(self.k): label = labels[sortDistanceIndex[i]] labelCount.setdefault(label,0) labelCount[label] += 1
        print("labelCount:\n",labelCount) sortLabelCount = sorted(labelCount.items(),key=lambda x:x[1], reverse=True) print(sortLabelCount) return sortLabelCount[0][0] if __name__ == '__main__': # 初始化類對象,前k個里面,哪個標簽最多,就預計是那個
    knn = KNN(3) # 創建數據集
    features, labels = knn.createData() # 數據集標准化
    new_data, maxs, mins = knn.Normalization(features) # 新數據的標准化
    one = np.array([176,76]) new_one = (one - mins) / (maxs - mins) result = knn.classify(new_one, new_data, labels) print("數據{}的預測性別為:{}".format(one, result)) 

運行結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM