一、K-近鄰算法原理
如圖所示,數據表中有兩個屬性,兩個標簽(A,B),預測最后一行屬於哪種標簽。
屬性一 | 屬性二 | 標簽 |
2.1 | 1.2 | A |
1.3 | 2.5 | B |
1.4 | 2.3 | B |
2.2 | 1.3 | A |
2.3 | 1.5 | A |
2.1 | 1.4 | ? |
通過可視化數據,可以看到A和B分別集中某一領域,觀察可見,第六行(2.1,1.4)比較靠近標簽A。
K-近鄰原理:因為未知標簽的屬性是已知的,可以通過計算未知標簽的屬性與已知標簽的屬性的距離,參數K表示最近鄰居的數目,如當K=3,即取最近的三個距離值,通過概率論,三個之中哪個標簽占的概率高就代表,未知標簽就是等同此標簽。
公式:
例如:點(1,0)與(2.3)之間的距離計算為:
((1-0)^2 +(2-3)^2)再開方
《機器學習實戰》這本書原話:
對未知類別屬性的數據集中的每個點依次執行以下操作:
(1) 計算已知類別數據集中的點與當前點之間的距離;
(2) 按照距離遞增次序排序;
(3) 選取與當前點距離最小的k個點;
(4) 確定前k個點所在類別的出現頻率;
(5) 返回前k個點出現頻率最高的類別作為當前點的預測分類。
二、代碼處理K-近鄰算法步驟
1 import numpy as np #導入numpy模塊 2 import operator as op #導入operator模塊 3 import operator 4 5 6 #生成訓練數據函數 7 def createDataSet(): 8 dataSet = np.array([[2.1,1.2],[1.3,2.5],[1.4,2.3],[2.2,1.3],[2.3,1.5]]) #數據集的規模是四行兩列的數組 9 labels = ['A','B','B','A','A'] #數據集每一條記錄所對應的標簽 10 return dataSet, labels #返回數據集數據和它對應的標簽
#K-NN預測分類函數 #inX:一條未知標簽的數據記錄 #dataSet:訓練數據集 #labels:訓練數據集每一條記錄所對應的標簽 #k:事先人為定義的數值 def classify0(inX, dataSet, labels, k): #獲取數據集的行數或者記錄數,.shape[0]:獲取矩陣的行數,.shape[1]:獲取數據集的列數 dataSetSize = dataSet.shape[0] #將修改規模后的未知標簽的數據記錄與訓練數據集作差 diffMat = np.tile(inX, (dataSetSize,1)) - dataSet #再將對應得到的差值求平方 sqDiffMat = diffMat**2 #橫向求得上面差值平方的和,axis=1:表示矩陣的每一行分別進行相加 sqDistances = sqDiffMat.sum(axis=1) #再對每條記錄的平方和開方,得到每一條已知標簽的記錄與未知標簽數據的距離 distances = sqDistances**0.5 #對求得的距離進行排序,返回的是排序之后的數值對應它原來所在位置的下標 sortedDistIndicies = distances.argsort() #創建一個空的字典,用來保存和統計離未知標簽數據最近的已知標簽與該標簽的個數,標簽作為字典的key(鍵),該標簽的個數作為字典的value(值) classCount={} for i in range(k): #sortedDistIndicies[i]排序之后得到的k個離未知標簽數據最近的訓練數據記錄下標,比如是第二條記錄,那它就等於1(下標從零開始) #voteIlabel就是:訓練數據第sortedDistIndicies[i]條記錄的標簽 voteIlabel = labels[sortedDistIndicies[i]] #把上面得到的那個標簽作為字典的鍵,並且累計k個標簽中,該標簽有多少個,這個累計個數作為該標簽的鍵值,也就是value classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #對上面循環得到的標簽統計字典進行按值(標簽的累計數)排序,並且是從大到小排序 #下面的寫法是固定的 #classCount.items():得到字典的鍵和值兩個列表 #key=operator.itemgetter(1):指明該排序是按字典的值從小到大排序,與鍵無關 #reverse=True:從大到小排序 sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) #統計數最大的那個標簽,作為對未知標簽的預測,也就是該返回標簽就是未知標簽數據inX的預測標簽了 return sortedClassCount[0][0]
#填寫一個預測屬性值,輸出屬性對應的標簽 aa = classify0([1.2,2.3], dataSet, labels, 3) print(aa)
以上就是簡單的K-近鄰算法的理論原理和代碼實現過程
以上就是我的拙見,非常感謝您能看到這里,有什么問題可以評論指正哦。