Python3.2 實現基于KNN算法的數據分類

jopen 10年前發布 | 24K 次閱讀 Python 算法

1 KNN算法的基本原理

KNN屬于監督學習,要求事先準備好已知分類結果的數據集(即樣本數據),其基本原理較為簡單。對于待分類的數據集,將其各特征值與樣本數據對應的特征值進行比較,然后提取出樣本集中與待分類數據的特征最相近的k個數據所對應的分類結果標注,最后從中找出出現最多的那個標注作為待分類數據的最終分類結果。

2 一個簡單的待解決問題

已有數據:

group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels=['a','a','b','b']

兩組待分類數據:

[1.0,0.8]

[0.5,0.5]

求兩組待分類數據分別屬于哪一類

3 代碼
    from numpy import *  
    import operator  

    #已有數據,以及對應的標簽  
    group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])  
    labels=['a','a','b','b']  

    ''''' 
    作用:將待分類數據集與已有數據集以其標簽進行計算,從而得出待分類數據集最有可能所屬的類別 
    參數: 
    inX:待分類數據集 
    dataSet:已有數據集,通過createDataSet()函數獲取 
    labels:已有數據集對應的分類標簽,通過createDataSet()函數獲取 
    k:設置最小距離數 
    '''   
    def classify0(inX, dataSet, labels, k):  
        dataSetSize = dataSet.shape[0] #獲取數據集的行數  

        #計算距離  
        #tile(a,(b,c)):將a的內容在行上重復b次,列上重復c次  
        #下面這一行代碼的結果是將待分類數據集擴展到與已有數據集同樣的規模,然后再與已有數據集作差  
        diffMat = tile(inX, (dataSetSize,1)) - dataSet   

        sqDiffMat = diffMat**2  #對上述差值求平方     
        sqDistances = sqDiffMat.sum(axis=1) #對于每一行數據求和  
        distances = sqDistances**0.5 #對上述結果開方  
        sortedDistIndicies = distances.argsort()  #對開方結果建立索引   

        #計算距離最小的k個點的Lable  
        classCount={}  #建立空字典,類別字典,保存各類別的數目  
        for i in range(k): #通過循環尋找k個近鄰  
            voteIlabel = labels[sortedDistIndicies[i]] #先找出開方結果索引表中第i個值對應的Label值  
            classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 # 存入當前label以及對應的類別值  

        sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) #對類別字典進行逆排序,級別數目多的往前放  

        #返回結果  
        return sortedClassCount[0][0] #返回級別字典中的第一個值,也就是最有可能的Label值  

    #進行分類  
    print(classify0([1.0,0.8],group,labels,3))  
    print(classify0([0.5,0.5],group,labels,3))  

4 執行結果

20140510213753015.png

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!