參看文章:算法
《機器學習-周志華》數組
《機器學習實戰-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.沒法給出任何數據的基礎結構信息
錯誤率(暫未看懂)
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樹