機器學習實戰之K-鄰近算法

k-鄰近算法
        k-鄰近算法採用測量不同特徵值之間的聚類方法進行分類。

1 基本原理:

        存在一個樣本數據集合,也稱作訓練樣本集,並且樣本集中每個數據都存在標籤,即我們知道樣本集中每一數據與所屬分類的對應關係。輸人沒有標籤的新數據後,將新數據的每個特徵與樣本集中數據對應的特徵進行比較,然後算法提取樣本集中特徵最相似數(最近鄰)的分類標籤。一般來說,我們只選擇樣本數據集中前k個最相似的數據,這就是k-近鄰算法中k的出處,通常*是不大於20的整數。最後,選擇k個最相似數據中出現次數最多的分類,作爲新數據的分類。

2 k-鄰近算法的一般流程
(1)收集數據:可以使用任何方法。
(2)準備數據:距離計算所需要的數值,最好是結構化的數據格式。
(3)分析數據:可以使用任何方法。
(4)訓練算法:此步驟不適用於1 近鄰算法。
(5)測試算法:計算錯誤率。
(6)使用算法:首先需要輸入樣本數據和結構化的輸出結果,然後運行女-近鄰算法判定輸
入數據分別屬於哪個分類,最後應用對計算出的分類執行後續的處理。
     (1)計算已知類別數據集中的點與當前點之間的距離;
     (2)按照距離遞增次序排序;
     (3)選取與當前點距離最小的k個點;
     (4)確定前k個點所在類別的出現頻率;
     (5)返回前k個點出現頻率最高的類別作爲當前點的預測分類。
3  簡單實現
   (1)
from numpy import *
import operator
def createDataSet():
group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels=['A','A','B','B']
return group, labels
導入數據集,並將數據點(1,1.1)歸爲A類,(0,0.1)歸爲B類
(2)
from numpy import *
import operator
from os import listdir
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances ** 0.5
sortedDistIndicies = distances.argsort()
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
在這裏先熟悉幾個方法:
      1)shape[],實現對矩陣的長度的讀取,shape[0]指的是讀取矩陣第一維度的長度。
      2)argsort(),返回的是數組值從大到小的索引。比如:
           import numpy as np
           x=np.array([1,4,3,-1,6,9])
           x.argsort()
          則返回的結果是:array([3, 0, 2, 1, 4, 5], dtype=int64)
          也就是在x列表中-1最小,其索引爲3,故結果中第一個元素是3.
     3).iteritems()是迭代器函數,用於獲取字典中的鍵值對;
     4)operator.itemgetter():用於獲取對象的哪些維的數據,參數爲一些序號(即需要獲取的數據在對象中的序號)
           比如:
           a = [1,2,3] 
           >>> b=operator.itemgetter(1)      //定義函數b,獲取對象的第1個域的值
           >>> b(a) 
           2 
     5)tile見博客
上述(2)代碼是k鄰近算法的具體實現,其中用於分類的輸入向量是inX,輸入的訓練樣本集爲dataset,標籤向量爲labels,最後的參數k表示用於選擇最近鄰居數目。6-9行代碼是兩點間距離的計算,for循環實現的是確定前k個距離最小元素所在的主要分類,後面的代碼是對元素進行排序。
 距離計算公式採用的是歐式距離公式:
           
                                                                                         





 接下來在python中輸入classify0([0,0],group,labels,3),輸出結果將是B,也就是說[0,0]被分到了B類。



201707281940持續更新~~~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章