1. 程式人生 > >MATLAB學習之路(三) 實現KNN演算法

MATLAB學習之路(三) 實現KNN演算法

之前的兩種演算法(CFSFDP與LSH)實現完後,這次我們來實現一個比較簡單的演算法——KNN演算法(K-Nearest Neighbor)KNN演算法又被稱作k近鄰分類演算法(k-nearest neigbhor classification)演算法,可以說是最簡單基礎的分類演算法了,需要計算的步驟也較少,固化的方式令此演算法只需要記住所有的訓練資料,對於新資料,套用舊資料集進行匹配,如果存在相同屬性的訓練資料,則直接用它來分類,這種方式有一個明顯的缺點,那就是很可能無法找到完全匹配的訓練記錄。我記得大資料分析的某教材書上稱:“KNN演算法本身簡單有效,它是一種lazy-learning(懶人學習)演算法,分類器不需要使用訓練集進行訓練,訓練時間複雜度為0。KNN分類的計算複雜度和訓練集中的數目成正比,也就是說,如果訓練集記錄總數為n,那麼KNN的分類時間複雜度為O(n)。”其中,不需要使用訓練集說的有些歧義,應該是需要的,但僅僅只需要少量的,一次性的訓練集而已。

演算法步驟為1、初始化距離為最大值 2、計算未知樣本和每個訓練樣本的距離dist 3、得到目前K個最臨近樣本中的最大距離maxdist 4、如果dist小於maxdist,則將該訓練樣本作為K-最近鄰樣本 5、重複步驟2、3、4,直到未知樣本和所有訓練樣本的距離都算完 6、統計K個最近鄰樣本中每個類別出現的次數 7、選擇出現頻率最大的類別作為未知樣本的類別 (其實吧,這些都木有用啊,背下來也不知說的是啥)好吧-----------這是一條可愛而溫柔的分割線------------老樣子,用通俗易懂的語言結合實際來解釋QWQ首先,有三個輸入量需要弄清楚,分別是:最近鄰數目K,訓練集D,測試集Z。還有一個輸出量,就是對測試集Z中的所有樣本預測其類標號值,結合具體的資料集

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