最近鄰算法(KNN)


最近鄰算法:

1.什么是最近鄰是什么?

  kNN算法全程是k-最近鄰算法(k-Nearest Neighbor)

  kNN算法的核心思想是如果一個樣本在特征空間中的k個最相鄰的樣本中的大多數數以一個類型別,則該樣本也屬於這個類別,並具有該類別上樣本的特征。該方法在確定分類決策上,只依據最近鄰的一個或者幾個樣本的類別來決定待分樣本所屬的類別。

下面舉例說明:

 

即使不知道未知電影屬於哪個類型,我們也可以通過某種方式計算,如下圖

 

現在,我們得到了樣本集中與未知電影的距離,按照距離的遞增順序,可以找到k個距離最近的電影,假設k=3,則三個最靠近的電影是he is not realy into Dudes,Beautiful women, California man , kNN 算法按照距離最近的三部電影類型決定未知電影的類型,這三部都是愛情片,所以未知電影的類型也是愛情片。

2:kNN算法的一般流程

  • step.1---初始化距離為最大值
  • step.2---計算未知樣本和每個訓練樣本的距離dist
  • step.3---得到目前K個最鄰近樣本中的最大距離maxdist
  • step.4---如果dist小於maxdist, 則將訓練樣本作為K-最近鄰樣本
  • step.5---重復步驟2,3,4,直到未知樣本和所有訓練樣本的距離都算完
  • step.6---統計K-最近鄰樣本中每個類標號出現的次數
  • step.7---出現頻率最大的類標號最為未知樣本的類標號

3.距離公式

在KNN算法中,通過計算對象間距離作為各個對象之間的非相似性指標,避免了對象之間的匹配問題,在這里距離一般使用歐式距離或者曼哈頓距離:

 

 對應代碼如下

#  kNN算法全稱是k-最近鄰算法(K-Nearest Neighbor)
from numpy import *
import operator

# 創建數據函數
def createDataSet():
    """ 創建數據集,array 創建數組
    array數組內依次是打斗次數, 接吻次數
    group小組, labels標簽"""
    group = array([[3, 104], [2, 100], [1, 81], [101, 10], [99, 5], [98, 2]])
    labels = ["愛情片", "愛情片", "愛情片", "動作片", "動作片", "動作片"]
    return group, labels

# 歸類函數
def classify(inX, dataSet, labels, k):
    """ 獲取維度,
     inX 待測目標的數據,
     dataSet 樣本數據,
     labels 標簽,
     k 設置比較鄰近的個數"""
    dataSetSize = dataSet.shape[0]  # 訓練數據集數據 行數
    print(dataSetSize)
    print(tile(inX, (dataSetSize, 1)))

    diffMat = tile(inX, (dataSetSize, 1)) - dataSet  # 測試數據,樣本之間的數據 矩陣偏差
    print(diffMat)

    sqDiffMat = diffMat**2  # 平方計算,得出每個距離的值
    print(sqDiffMat)

    sqDistance = sqDiffMat.sum(axis=1)  # 輸出每行的值
    print(sqDistance)

    distances = sqDistance**0.5  # 開方計算
    print(distances)

    sortedDistances = distances.argsort()  # 排序 按距離從小到大 輸出索引
    print(sortedDistances)

    classCount = {}
    for i in range(k):
        voteIlabel = labels[sortedDistances[i]] + 1.0 # 按照排序,獲取k個對應的標簽
        classCount[voteIlabel] = classCount.get(voteIlabel, 0)  # 在字典中添加距離最近的k個對應標簽
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)

    return sortedClassCount[0][0]

group, labels = createDataSet()
res = classify([18, 90], group, labels, 3)
print(res)

 運行結果:

 

 

 知識擴展:

python3字典中items()和python2.x中iteritems()有什么不同?
numpy中 array數組的shape屬性
numpy 中 shape_base提供的tile方法

 


免責聲明!

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



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