前言
本文介紹機器學習分類演算法中的K-近鄰演算法並給出虛擬碼與Python程式碼實現。
演算法原理
首先獲取訓練集中與目標物件距離最近的k個物件,然後再獲取這k個物件的分類標籤,求出其中出現頻數最大的標籤。
而這個標籤,就是分類的結果。
虛擬碼
對訓練集做以下操作:
1. 計算訓練集中各點與當前點之間的距離(本文采用最經典的歐式距離)
2. 按照距離遞增次序對各點排序
3. 選取與當前點距離最小的k個點
4. 確定前k個點所在類別的出現頻率
5. 返回前k個點出現頻率最高的類別,即為分類結果。
程式碼示例
1 #!/usr/bin/env python 2 # -*- coding:UTF-8 -*- 3 4 ''' 5 Created on 20**-**-** 6 7 @author: fangmeng 8 ''' 9 10 # 匯入numpy數學運算庫 11 import numpy 12 # 匯入運算子函式庫 13 import operator 14 15 # ============================================== 16 # 輸入: 17 # 空 18 # 輸出: 19 # group, labels:樣本訓練集及其對應標籤集 20 # ============================================== 21 def createDataSet(): 22 '建立訓練集及其對應標籤集並返回' 23 24 group = numpy.array([[1.0, 1.1], [1.0, 1.0], [0.0, 0.0], [0.0, 0.1]]) 25 labels = ['A', 'A', 'B', 'B'] 26 27 return group, labels 28 29 # ============================================== 30 # 輸入: 31 # inX:目標向量 32 # dataSet:訓練集 33 # labels:訓練集對應的標籤集 34 # k:演算法引數 35 # 輸出: 36 # sortedClassCount[0][0]:目標向量的分類結果 37 # ============================================== 38 def classify0 (inX, dataSet, labels, k): 39 'kNN 分類器' 40 41 #計算目標向量與訓練集中所有物件的距離並排序 42 dataSetSize = dataSet.shape[0] 43 diffMat = numpy.tile(inX, (dataSetSize, 1)) - dataSet 44 sqDiffMat = diffMat ** 2 45 sqDistances = sqDiffMat.sum(axis=1) 46 distances = sqDistances ** 0.5 47 sortedDistIndicies = distances.argsort() # 返回陣列從小到大的索引值 48 49 # 取出與目標向量距離最近的三個 50 classCount = {} # 該字典存放各種標籤及其對應的頻數 51 for i in range(k): # 由前 k 位索引的結果構建字典 52 voteIlable = labels[sortedDistIndicies[i]] 53 classCount[voteIlable] = classCount.get(voteIlable, 0)+1 54 55 # 以各個標籤的頻率為基準進行排序 56 sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) 57 58 return sortedClassCount[0][0] # 返回出現頻率最高的標籤 59 60 def test(): 61 '分類器測試函式' 62 63 # 新建訓練集及其對應標籤集 64 group, labels = createDataSet() 65 66 # 輸入目標向量並返回分類結果後列印 67 label = classify0([0.0, 0.0], group, labels, 3) 68 print label 69 70 if __name__ == '__main__': 71 # 呼叫測試函式 72 test()
執行結果
小結
1. 本文簡要介紹了機器學習中經典的K-近鄰演算法,並給出了程式碼實現。
2. 該演算法的缺點有三個:
a. 耗費空間資源大:要儲存整個資料集
b. 耗費時間資源大:要對資料集中的每個樣本求距離。當樣本很多,或者特徵資訊多的時候,效率是挺坑的。
c. 沒有給出資料的基礎結構資訊。(本身K-近鄰演算法就沒有嚴格意義上的訓練過程)
3. 後面的文章中,將講解如何將此演算法應用於具體專案中。