簡單地說,k-近鄰演算法採用測量不同特徵值之間的距離方法進行分類,屬於監督學習。
工作原理:村愛乙個樣本資料集合(亦稱訓練樣本集),並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將新資料每個特徵與樣本集中資料對應的特徵進行比較,然後演算法提取樣本集中特徵最相似資料(最近鄰)的分類標籤。一般來說,我們只選擇樣本資料集中前k個最相似的資料,這就是k-近鄰演算法中k的出處,通常k是不大於20的整數,最後,選擇k個最相似資料中出現次數最多的分類,作為新資料的分類。
演算法的一半流程:
核心**:
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]
解析
4個輸入引數:用於分類的輸入向量inx
,訓練樣本集dataset
,標籤向量labels
,用於選擇最近鄰的數目k
;
datasetsize = dataset.shape[0]
這一句使用到了numpy
的shape
函式,返回矩陣/陣列的不同維數的長度,第乙個元素(shape[0])表示第一維的長度,亦即行數,可參考numpy.shape;
diffmat = tile(inx, (datasetsize,1)) - dataset
這裡用到了numpy
中的tile(a,reps)
函式,用於擴充a,具體用法可以參考numpy.tile;
sqdiffmat = diffmat**2
求平方;
sqdistances = sqdiffmat.sum(axis=1)
求和可參考numpy.sum;
distances = sqdistances**0.5
求開方,上面的幾步是用來計算距離的;
sorteddistindicies = distances.argsort()
使用了argsort()
函式,可以參考:numpy.argsort;
classcount={}
這是乙個dict
,用於儲存不同標籤出現的次數;
for i in range(k):
voteilabel = labels[sorteddistindicies[i]]
classcount[voteilabel] = classcount.get(voteilabel,0) + 1
這裡是選擇距離最小的k
個點,sorteddistindicies
已經排好序,只需迭代的取前k
個樣本點的labels(即標籤),並計算該標籤出現的次數,這裡還用到了dict.get(key, default=none)
函式,key
就是dict
中的鍵voteilabel
,如果不存在則返回乙個0並存入dict
,如果存在則讀取當前值並+1;
sortedclasscount = sorted(classcount.iteritems(), key=operator.itemgetter(1), reverse=true)
這裡使用了sorted()
函式sorted(iterable, cmp=none, key=none, reverse=false),iteritems()
將dict
分解為元組列表,operator.itemgetter(1)
表示按照第二個元素的次序對元組進行排序,注意sort()
的區別,可參考numpy.sort;
機器學習實戰1 K近鄰演算法(KNN)
knn k nearest neighbors 演算法,也叫k最近鄰演算法。主要思想是,如果乙個樣本在特徵空間中的k個最相似 或最鄰近 的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。例如,村里投票建水井,有三個選址a,b和c,所有的人家都投了票,除了李四家。村書記決定找出距李四家最近的6戶...
機器學習實戰 1 K近鄰
1.np.tile array,行重複次數,列重複次數 a np.array 1,2,3 b np.tile a,2,3 b 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 2.array.sum axis 0 1 0 每列求和 1 沒行求和 3.array.argsort ...
機器學習實戰筆記1 K近鄰演算法詳解
最近在看 機器學習實戰 這本書,書中的 都是對某種演算法在對應應用場景的實現,感覺比大學時代的資料結構或者演算法題還要晦澀難懂,只能慢慢學習了,演算法這種東西類似做數學題,要多做多練。k 近鄰演算法乙個典型的應用場景就是在區別電影類別中,比如說根據在電影片段中出現親吻,打 鬥場景來判斷電影是否是愛情...