K-近鄰算法-理論原理


一、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-近鄰算法的理論原理和代碼實現過程

 

 以上就是我的拙見,非常感謝您能看到這里,有什么問題可以評論指正哦。

 


免責聲明!

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



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