機器學習-KNN近鄰算法

參看文章:算法

《機器學習-周志華》數組

《機器學習實戰-Peter Harrington》機器學習

《統計學習方法-李航》學習

算法介紹:

k近鄰學習是一種經常使用的監督學習方法,其工做機制以下,給定測試樣本,基於某種距離度量(曼哈頓距離、歐氏距離、切比雪夫距離、Lp距離、Minkowski距離)找出訓練集中與其最靠近的k個訓練樣本,而後基於這k個「鄰居」的信息來進行預測。測試

argmax(f(x))是使得 f(x)取得最大值所對應的變量點x優化

投票法:

分類任務中使用,選擇k個樣本出現最多的類別標記做爲預測結果spa

平均法:

迴歸任務中使用,即將k個樣本的實值輸出標記的平均值做爲預測結果code

距離權重法:

稱爲k近鄰算法的優化算法,爲每一個點的距離增長一個權重,使得距離近的點能夠獲得更大的權重,既可用於加權平均又可用於加權投票。blog

優缺點:

優勢:排序

1.理論成熟,思想簡單,既能夠用來作分類又能夠作迴歸

2.訓練時間複雜度爲O(n);無數據輸入假定;

3.可用於數值型數據和離散型數據;

4.對異常值不敏感

缺點:

1.計算複雜度高,因無顯示的訓練過程

2.對k值、距離敏感,不一樣k值與距離計算方法可能結果不一樣

3.沒法給出任何數據的基礎結構信息

最近鄰分類器(k = 1)

錯誤率(暫未看懂)

實現方法:

1. 傳統法代碼:

 

 1 #-*- coding: utf-8 -*-  2 import numpy as np  3 import operator  4  5 def createDataSet():  6 #建立數據集,包含樣本group,標籤labels  7 group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])  8 labels = ['A', 'A', 'B', 'B']  9 return group, labels 10 11 def classify0(inX, dataSet, labels, k): 12 #shape[0]返回數據集的行數,shape[1]返回數據集的列數 13 dataSetSize = dataSet.shape[0] 14 #tile(array,(a,b),把array按a行,b列進行復制,a,b爲1時維持原行數或列數 15 diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet 16 sqDiffMat = diffMat**2 17 #sum(axis = 1)對行求和,sum(aixs = 0)對列求和 18 sqDistances = sqDiffMat.sum(axis=1) 19 distances = sqDistances**0.5 20 ''' 21  argsort(x)升序排序,argsort(-x)降序排序,argsort(x, axis=0)按列排序,返回的是原數組從小到大排序的下標值 22  np.argsort(x, axis=1)按行排序;默認按列排序 23 ''' 24 sortedDistIndicies = distances.argsort() 25 classCount = {} 26 for i in range(k): 27 voteIlabel = labels[sortedDistIndicies[i]] 28 classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 29 # sorted(iterable, cam = None, key = None, reverse = True/False),True按倒序排列,False按升序排列 30 #items() 方法以列表返回可遍歷的(鍵, 值) 元組數組, 31 # key = operator.itemgetter(1)根據字典的值進行排序 32 # key = operator.itemgetter(0)根據字典的鍵進行排序 33 sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) 34 #返回次數最多的類別 35 return sortedClassCount[0][0] 36 37 if __name__ == "__main__": 38 group, labels = createDataSet() 39 y = classify0([0, 0], group, labels, 3) 40 print(y)

 

2. kd樹

相關文章
相關標籤/搜索