machine learning in action 之二 —— k-Nearest Neighbors

Python的使用我就不詳細介紹了,因爲我自己也不是特別熟悉(O(∩_∩)O哈哈~),不過Python和matlab差不多,語法很簡單,用多了看多了自然就熟悉了,我之所以記錄“machine learning in action”主要的目的也不是熟悉python,主要是記錄我的學習過程,想提高自己的算法邏輯能力,而主要的切入點是常見的machine learning算法。所以接下來的教程中,編程語法我不太會多說,主要側重於算法應用。

以下介紹的任何內容,大家有任何疑問,或者是對我有任何建議,可以隨時在評論中提出來,我會盡量經常去查看,並給大家回覆。

第一個要講的算法是k-Nearest Neighbors(K-NN),即K-近鄰算法,也是機器學習算法中最常見且簡單的一個分類算法,主要採用測量不同特徵值之間的距離來進行分類。

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

這個算法原理很簡單,所以我就不多說了,直接講解代碼實現。

功能:使用k-近鄰算法將每組數據劃分到某個類別中,僞代碼如下:

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

Python實現classify0(),如下:

# 程序清單2-1  k-近鄰算法
def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]
    # 距離計算
    # tile: repeat the items N times
    diffMat = tile(inX, (dataSetSize,1)) - dataSet
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5
    sortedDistIndicies = distances.argsort()
    # 選擇距離最小的k個點
    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]

classify0()函數有4個輸入參數:用於分類的輸入向量inX,輸入的訓練樣本集dataSet,標籤向量labels,最後參數k表示用於選擇最近鄰的數目,其中標籤向量的元素個數和矩陣dataSet的行數相同。程序清單2-1中使用歐氏距離公式(當然你可以換成其他的距離計算公式),計算兩個向量點xA和xB之間的距離:

d=(xA0xB0)2+(xA1xB1)2

如果特徵是多維的,那麼依次加在後面即可。

這樣,我們就構建了一個簡單的k-NN分類器了,使用這個分類器可以完成很多分類任務。

舉個簡單的例子:首先創建一個已知標籤的訓練集,這個數據集中只有4個數據{(1.0,1.1), (1.0,1.0), (0,0), (0,0.1)},前兩個屬於A類,後兩個屬於B類,python代碼如下:

# 程序清單2-2  數據導入模塊
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

實驗測試,創建名爲kNN.py的python模塊,將程序清單2-1和2-2輸入到這個文件中。

進入python開發環境,開始——運行——cmd——進入kNN文件夾——python,
首先導入kNN模塊,然後查看導入的數據集

>>> import kNN
>>> group,labels = kNN.createDataSet()

結果如下:
img1

然後使用classify0()進行數據分類預測

>>> kNN.classify0([0,0], group, labels, 3)

輸出結果爲:
img2
即預測結果爲[0,0]屬於“B”類,大家可以自己試試其他的數據分類結果。

到此,kNN簡單的分類器構建完成了,接下來會用構建的kNN處理實際問題。

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