第一篇:K-近鄰分類算法原理分析與代碼實現


前言

本文介紹機器學習分類算法中的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. 后面的文章中,將講解如何將此算法應用於具體項目中。


免責聲明!

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



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