常見機器學習演算法學習——KNN(K鄰近)
阿新 • • 發佈:2018-11-10
1、 演算法簡述
文章中描述性內容,多來自維基百科KNN。
KNN( k-nearest neighbors algorithm)是一種非引數、有監督演算法,由T. M. COVER, P. E. HART, Hart PE 在1967年提出,後被廣泛應用於模式識別領域,既可用於分類也可以用於迴歸。
KNN是一種懶學習(lazy learning)演算法,沒有顯式的訓練過程;將多維特徵空間中已經帶有分類(分類問題)或屬性值(迴歸問題)的資料集看做訓練集,計算預測樣本與訓練集中個樣本的鄰近度(實用向量距離體現,如歐氏距離,馬氏距離等),取K個最鄰近樣本,根據鄰近樣本投票(分類問題)或加權(迴歸問題),確定預測樣本的分類或屬性。因此,KNN演算法的計算量非常大。
借用維基百科這張被借用無數次的圖片來大致描述KNN分類。圖中藍色及紅色色塊表示訓練集中兩類兩類已打標籤的樣本,綠色圓形色塊為待確定分類的預測集,採用歐氏距離(及實際距離)為鄰近度準則,當K=3時,有效色塊即為圖中黑色圓形實線包圍的色塊,範圍內紅色三角形類別色塊2個,方形藍色色塊1個,則訓練集中的兩類色塊紅色佔多,則預測集綠色圓形色塊被歸入紅色三角一類;當K=5時,有效色塊即為圖中黑色圓形虛線包圍的色塊,範圍內紅色三角形類別色塊2個,方形藍色色塊3個,則訓練集中的兩類色塊藍色佔多,則預測集綠色圓形色塊被歸入藍色方形一類;
2、演算法特點
3、相似演算法
4、演算法實現
KNN最方便的實現方法當然是呼叫sklearn中的KNN相應方法,為了更清晰展示KNN的基本原理,此處給出僅實現KNN基本過程的玩具程式碼:
# -*- coding: utf-8 -*- """ Created on Tue Sep 25 01:18:35 2018 @author: yzp1011 """ import numpy as np import pandas as pd from functools import partial class KNN(object): def eu_distance(self,p1,p2): return np.linalg.norm(p1 - p2) def get_neighbors(self,train_set,test_set,k): vec = pd.DataFrame([partial(self.eu_distance,x) for x in train_set[:,0:-1]],columns = ['train']) print('vec\'s shae:{},label shape:{}'.format(vec.shape,len(train_set))) vec['label'] = train_set[:,-1].T try: assert test_set.shape[1] > 0 for v in test_set: res = vec['train'].map(lambda x:x(v)) out = vec.iloc[res.nlargest(k).index]['label'].mode()[0] print('x:{}-mode:{}'.format(v,out)) # 當預測向量長度為1時 except IndexError: res = vec['train'].map(lambda x:x(test_set)) out = vec.iloc[res.nlargest(k).index]['label'].mode()[0] print('x:{}-mode:{}'.format(test_set,out)) return self if __name__ == '__main__': model = KNN() train_set = [[1,1,1,1], [2,2,2,1], [1,1,3,1], [4,4,4,2], [0,0,0,1], [4,4.5,4,2]] test_instance = [5,5,5] k = 3 neigbors = model.get_neighbors(np.array(train_set),np.array(test_instance),k)