MATLAB學習之路(三) 實現KNN演算法
之前的兩種演算法(CFSFDP與LSH)實現完後,這次我們來實現一個比較簡單的演算法——KNN演算法(K-Nearest Neighbor)KNN演算法又被稱作k近鄰分類演算法(k-nearest neigbhor classification)演算法,可以說是最簡單基礎的分類演算法了,需要計算的步驟也較少,固化的方式令此演算法只需要記住所有的訓練資料,對於新資料,套用舊資料集進行匹配,如果存在相同屬性的訓練資料,則直接用它來分類,這種方式有一個明顯的缺點,那就是很可能無法找到完全匹配的訓練記錄。我記得大資料分析的某教材書上稱:“KNN演算法本身簡單有效,它是一種lazy-learning(懶人學習)演算法,分類器不需要使用訓練集進行訓練,訓練時間複雜度為0。KNN分類的計算複雜度和訓練集中的數目成正比,也就是說,如果訓練集記錄總數為n,那麼KNN的分類時間複雜度為O(n)。”其中,不需要使用訓練集說的有些歧義,應該是需要的,但僅僅只需要少量的,一次性的訓練集而已。
x1| x2|y
1|2|A
1|3|A
1|1|A
2|1|A
2|2|A
2|3|A
6|8|B
2|4|A
3|2|A
5|7|B
4|7|B
5|6|B
3|3|A
3|4|A
同時,對於新資料為(4,5)來說,其屬於哪一個類別,定義(K=3):
優先先計算出各點與(4,5)的歐式距離,然後對所得到的資料進行排序,在排序的同時對每個資料進行分類,最後以分類項加排序結果的形式顯示出來,當K=3時,取排序的前三位進行輸出。
就這麼簡單咯
下面是實現程式碼:
%{ 首先先要importdata資料集 注意!! 要求: 資料集中的最後一列為分類號,需要設定為text格式 匯入為cell陣列 隨後令匯入的cell陣列為aa 就是“aa=xxxxx”————>xxx是你所匯入資料集的cell陣列原名稱 一定要改 一定要改 一定要改 %} %獲取總長度 [num,row]=size(aa); %新資料點,可以改變,注意維度 new=[4,5]; %最近鄰數目K,可以改變 K=5; %計算新資料點到訓練集各點距離 new=new.'; a=[]; for i=1:num a(i,:)=[aa{i,1:(row-1)}]; d=dist(a(i,:),new); aa{i,(row+1)}=d; end newaa=sortrows(aa,[row+1]); disp('結果是:'); for i=1:K disp([newaa{i,:}]); end