Python KNN算法


  機器學習新手,接觸的是《機器學習實戰》這本書,感覺書中描述簡單易懂,但對於python語言不熟悉的我,也有很大的空間。今天學習的是k-近鄰算法。

  1. 簡述機器學習

  在日常生活中,人們很難直接從原始數據本身獲得所需信息。而機器學習就是把生活中無序的數據轉換成有用的信息。例如,對於垃圾郵件的檢測,偵測一個單詞是否存在並沒有多大的作用,然而當某幾個特定單詞同時出現時,再輔以考慮郵件的長度及其他因素,人們就可以更准確地判定該郵件是否為垃圾郵件。

  機器學習分為監督學習無監督學習,其中:

  (1)監督學習:包含分類和回歸。分類,是將實例數據划分到合適的分類中。回歸,主要用於預測數值形數據。因為這類算法必須知道預測什么,即目標變量的分類信息,所以稱為監督學習。

  (2)無監督學習:此時數據沒有類別信息,不能給定目標值。在無監督學習中,將數據集合分成由類似的對象組成的多個類的過程稱為聚類,將尋找描述數據統計值的過程稱為密度估計,此外,無監督學習還可以減少數據特征的維度,以便我們可以使用二維或三維圖形更加直觀地展示數據信息。

  以下是機器學習的主要算法:

  監督學習:k-近鄰算法(KNN),朴素貝葉斯算法,支持向量機(SVM),決策樹

         線性回歸,局部加權線性回歸,Ridge回歸,Lasso最小回歸系數估計

  無監督學習:K-均值,DBSCAN,最大期望算法,Parzen窗設計

  2. K-近鄰算法

  k-近鄰算法(KNN),是最基本的分類算法,其基本思想是采用測量不同特征值之間的距離方法進行分類。

  算法原理:存在一個樣本數據集合(訓練集),並且樣本集中每個數據都存在標簽(即每一數據與所屬分類的關系已知)。輸入沒有標簽的新數據后,將新數據的每個特征與樣本集中數據對應的特征進行比較(計算歐氏距離),然后提取樣本集中特征最相似數據(最近鄰)的分類標簽。一般會取前k個最相似的數據,然后取k個最相似數據中出現次數最多的標簽(分類)最后新數據的分類。

  算法偽碼:

對未知類別屬性的數據集中的每個點依次執行以下操作:
1)計算已知類別數據集中的點與當前點之間的距離;
2)按照距離遞增次序排序;
3)選取與當前點距離最小的k個點;
4)確定前k個點所在類別的出現頻率;
5)返回前k個點出現頻率最高的類別作為當前點的預測分類。

  歐氏距離計算:

  (1).二維平面上兩點xA(x1,y1)與xB(x2,y2)間的歐氏距離:

  

  (2).三維空間兩點xA(x1,y1,z1)xB(x2,y2,z2)間的歐氏距離:

  

  (3).兩個n維向量xA(x11,x12,…,x1n)與 xB(x21,x22,…,x2n)間的歐氏距離:

  

  算法實現如下:

#-*- coding: utf-8 -*-
from numpy import *
import operator
def classify(inputPoint,dataSet,labels,k):
    dataSetSize = dataSet.shape[0]     #已知分類的數據集(訓練集)的行數
    #先tile函數將輸入點拓展成與訓練集相同維數的矩陣,再計算歐氏距離
    diffMat = tile(inputPoint,(dataSetSize,1))-dataSet  #樣本與訓練集的差值矩陣
    sqDiffMat = diffMat ** 2                    #差值矩陣平方
    sqDistances = sqDiffMat.sum(axis=1)         #計算每一行上元素的和
    distances = sqDistances ** 0.5              #開方得到歐拉距離矩陣
    sortedDistIndicies = distances.argsort()    #按distances中元素進行升序排序后得到的對應下標的列表
    #選擇距離最小的k個點
    classCount = {}
    for i in range(k):
        voteIlabel = labels[ sortedDistIndicies[i] ]
        classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
    #按classCount字典的第2個元素(即類別出現的次數)從大到小排序
    sortedClassCount = sorted(classCount.items(), key = operator.itemgetter(1), reverse = True)
    return sortedClassCount[0][0]

  測試例子: 

if __name__ == "__main__" :
    dataset = array([[1.0, 1.1], [1.0, 1.0], [0.0, 0.0], [0.0, 0.1]])
    labels = ['A', 'A', 'B', 'B'] 
    X = array([1.2, 1.1])  
    Y = array([0.1, 0.1])
    k = 3
    labelX =  classify(X,dataset,labels,k)
    labelY =  classify(Y,dataset,labels,k)
    print "Your input is:", X, "and classified to class: ", labelX
    print "Your input is:", Y, "and classified to class: ", labelY

  結果如下:

Your input is: [ 1.2  1.1] and classified to class:  A
Your input is: [ 0.1  0.1] and classified to class:  B

  參考資料:

  1.《機器學習實戰》


免責聲明!

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



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