1. 程式人生 > >《機器學習實戰》學習筆記一:K近鄰演算法

《機器學習實戰》學習筆記一:K近鄰演算法

K近鄰演算法

kNN演算法的原理:

存在一個樣本資料集合,且每個樣本資料都有對應的標籤,即我們知道樣本集合中每一資料與所屬分類的對應關係。

輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集合中資料對應的特徵進行比較,然後提取樣本中最相似的K個分類標籤。

最後,選擇K個最相似資料中出現次數最多的分類,作為新資料的分類。

# coding=utf-8
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']
    #group和labels是四組資料,group表示座標,labels表示座標對應的特徵值
    return group,labels

#classify0是k近鄰演算法,計算用於分類的inX到dataSet的距離,判斷inX屬於哪個類。dataSet是訓練樣本資料集,labels是樣本對應的標籤值,k表示選取樣本前k個最相似的資料用於判斷inX屬於哪個分類。
def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]    #獲得dataSet的大小
    diffMat = tile(inX,(dataSetSize, 1)) - dataSet   #將inX擴充為(dataSetSize,1)即4行1列的矩陣,再與dataSet求差
    sqDiffMat = diffMat**2  
    sqDistances = sqDiffMat.sum(axis=1)   #.sum()執行加函式,引數axis=1表示矩陣每一行的各個值相加和
    distances = sqDistances**0.5
    sortedDistIndices = distances.argsort()
    classCount = {}
    for i in range(k):
        voteIlabel = labels[sortedDistIndices[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]

1.createDataSet用於建立訓練樣本資料集,本例中建立了四個樣本資料,分別為[1.0,1.1],[1.0,1.0],[0,0],[0,0.1],對應的分類(或稱為特徵值)分別為A,A,B,B

2.classify0函式是分類演算法,輸入的四個引數分別為(待分類的資料,樣本資料,樣本標籤,相似樣本標籤的個數)

首先,根據歐式距離公式求得待分類的資料到每個樣本資料的距離distances

dataSetSize:獲得dataSet的大小,為4

diffMat:將inX擴充為(dataSetSize,1)(即4行1列)的矩陣,再與dataSet求差值

然後,argsort函式表示從小到大排序,返回索引0,1,2,3,距離最近---距離最遠

3.對距離最近的k個樣本,進行分類分析

首先,獲得距離最近的k個樣本資料對應的樣本標籤

classCount表示每個樣本標籤以及出現次數的字典

然後,使用sorted函式排序,返回出現次數最多的標籤

[0,0]屬於B類