k-近鄰演算法是採用不同特徵之間的距離方法進行分類。
優點:精度高、對異常值不敏感、無資料輸入假定
缺點:計算複雜度高、空間複雜度高
k-近鄰演算法的一般流程
(1)收集資料集:可以使用任何方法
(2)準備資料集:距離計算所需要的數值,最好是結構化的資料格式
(3)分析資料:可以使用任何方法
(4)訓練資料集:此步驟不適用與k-近鄰演算法
(5)測試演算法:計算錯誤率
(6)使用演算法:首先需要輸入樣本資料和結構化輸出結果,然後執行k-近鄰演算法判斷輸入資料分別屬於那個分類,最後應用對計算出的分類執行後續的處理。
2.1.1 準備:使用python匯入資料
#createdataset()from numpy import *import operatordef createdataset(): group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) labels=['a','a','b','b'] return group,labels
2.1.2 實施k-近鄰演算法
k-近鄰演算法的偽**:
對未知屬性集中的每個點依次執行以下操作:
(1)計算已知類別資料中心的點與當前點之間的距離
(2)按照距離遞增次序排序
(3)選取與當前點距離最最小的k個點
(4)確定當前k個點所在類別的出現頻率
(5)返回前k個點出現頻率最高的類別作為當前點的**分類
#k-近鄰演算法def classify0(inx,dataset,labels,k): datasetsize=dataset.shape[0]#計算有多少個點 diffmat=tile(inx,(datasetsize,1))-dataset #計算歐氏距離 sqdiffmat=diffmat**2 sqdistance=sqdiffmat.sum(axis=1) distances=sqdistance**0.5 sorteddistindicies=distance.argsort() classcount={} for i in range(k): #選擇距離最小的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]
2.1.3 通過學習函式理解k-近鄰演算法
看了上述knn的實現,可能大家還是一頭霧水,因為其中用到了很多內嵌函式,所以下面我們就先來學習這些內嵌函式。
1.tile函式
函式形式是tile(a,reps)a的型別幾乎所有型別都可以:array,list,tuple,dict,matrix以及基本的資料型別int,string,float,bool等。
reps的型別可以使tuple,list,dict,array,int,bool但不可以是float,string,matrix。
import numpynumpy.tile(1,(5,1)) array([[1], [1], [1], [1], [1]])numpy.tile(2,(5,2))array([[2, 2], [2, 2], [2, 2], [2, 2], [2, 2]])numpy.tile((3,2),(5,2)) array([[3, 2, 3, 2], [3, 2, 3, 2], [3, 2, 3, 2], [3, 2, 3, 2], [3, 2, 3, 2]])
2.shape函式
功能是讀取矩陣的長度,輸入引數可以是乙個整數表示維度,也可以是乙個矩陣。舉例說明:
import numpyarray1 = numpy.tile(1,(3,2))array1 array([[1, 1], [1, 1], [1, 1]]) array1.shape (3l, 2l) array1.shape[0] #shape[0]表示第一維的長度 3larray1.shape[1] #shape[1]表示第二維的長度2l
3.sum函式
sum(a,axis=0)或者sum(axis=1)axis=0就是普通的相加,axis=1則是將乙個矩陣的每一行向量相加
舉例說明:
import numpyarray1 = numpy.tile(1,(3,2))array1array([[1, 1], [1, 1], [1, 1]]) array1.sum()array1.sum(axis=1) array([2, 2, 2])
4.argsort函式
返回陣列值從小到大的索引值舉例說明:
import numpy as npx = np.array([3, 1, 2])np.argsort(x) array([1, 2, 0], dtype=int64)x = np.array([[0, 3], [2, 2]])x array([[0, 3], [2, 2]])np.argsort(x, axis=0) #按列排序 array([[0, 1], [1, 0]], dtype=int64)np.argsort(x, axis=1) #按行排序 array([[0, 1], [0, 1]], dtype=int64)x = np.array([3, 1, 2])np.argsort(x) #按公升序排列array([1, 2, 0], dtype=int64)np.argsort(-x) #按降序排array([0, 2, 1], dtype=int64)
參考鏈結
《機器學習實戰》
python中的tile函式,shape函式,sum函式,argsort函式,python交流,技術交流區,魚c論壇 - powered by discuz!
(出處: 魚c論壇)
K近鄰的MATLAB實現
參考 1 計算已知類別資料集合彙總的點與當前點的距離 2 按照距離遞增次序排序 3 選取與當前點距離最近的k個點 4 確定距離最近的前k個點所在類別的出現頻率 5 返回距離最近的前k個點中頻率最高的類別作為當前點的 分類 function relustlabel knn inx,data,label...
Matlab實現加權K近鄰
加權k近鄰是k近鄰的一種修正,當理解k近鄰之後,加權k近鄰則很好理解了,不說了,上 function label1 wknn training,testing,k row,column size training row1,column1 size testing 計算測試集與訓練集的距離 dist...
MATLAB計算K近鄰
在實驗中經常會需要計算k近鄰,為了避免多次重寫,這裡用matlab實現了乙個計算k近鄰的函式,該函式要求輸入兩個引數,第乙個引數就是資料矩陣,要求每行為乙個多維樣本點,第二個引數就是k值了。函式返回k近鄰矩陣。計算k近鄰比較好的一種演算法是利用kd樹,這裡暫且用的是易於理解的常規方法。使用kd樹的 ...