【數據挖掘】MATLAB實現K最近鄰算法

K最近鄰算法的MATLAB實現


代碼實現

實現程序如下:

測試代碼:

function main
load('testingData.mat');  %載入數據--測試樣本
load('trainingData.mat'); %載入數據--訓練樣本

trAttr = trAttr(:,1:end);
trLabels = trLabels(:,end);
tstAttr = tstAttr(:,1:end);
tstLabels = tstLabels(:,end);

[trAttr]=normalize(trAttr); %歸一化
[tstAttr]=normalize(tstAttr);

k=3;
predictlabel = zeros(length(tstLabels),1); %預測類別--初始化
for i=1:length(tstLabels)
   predictlabel(i) = KNN_Classify_E(trAttr, trLabels ,tstAttr(i,:) ,k);
end
accurate = sum(predictlabel==tstLabels)/length(tstLabels); % 準確率
disp(accurate);
end

K最近鄰算法:

function [class] = KNN_Classify_E(trainingSamples, trainingLabels, testingSample,k)

% 1 得到訓練數據集trainingSamples的大小M,N
[M,N] = size(trainingSamples); 

% 2 初始化Distance數組(M*1),用來存儲每個訓練樣本與測試樣本的距離
Distance = zeros(M,1); 

% 3 對每一個訓練樣本trainingSamples(i,:),計算其與測試樣本testingSample之間的距離,存儲在Distance(i)中
for i=1:M
    training = trainingSamples(i,:);
    Distance(i) = dist_E(training,testingSample); % dist_E爲歐氏距離計算函數
end

% 4 對Distance數組排升序
[val ind] = sort(Distance); % sort函數默認升序,此處有兩個輸出參數,val:距離排序後的值,ind:val中每個元素在原矩陣Distance中的位置

% 5 取得排序前K個距離對應的序號-->ind(1:k),將序號對應的訓練數據的分類標籤trainingLabels得到賦給labs 
labs = trainingLabels(ind(1:k));

% 6 得到labs數組的不重複元素,存儲在數組All_labs 
All_labs = unique(labs); % unique函數:返回與labs中相同的數據,但是不包含重複項

% 7 得到不重複元素(數組All_labs )的個數LabNum
LabNum = length(All_labs);

% 8 對每一個不重複的分類標籤All_labs(i) ,查找最近的k個類別標籤labs中,等於All_labs(i)的有幾個,將該數目作爲第i類的投票數Vote(i)
for i=1:LabNum
    Vote(i) = length(find(labs==All_labs(i)));
end

% 9 求投票數Vote(i)的最大值所在的索引ind
[val ind] = max(Vote); % max函數 返回Vote的最大元素

% 10 All_labs(ind)是最大投票數對應的類別標籤,即爲算法輸出結果class
class = All_labs(ind);

end

規範化:

function [Samples2]=normalize(Samples)
[M,N] = size(Samples);

Samples2 = zeros(M,N);
for i=1:N
    allAtr = Samples(:,i);
    STD = std(allAtr);    % 求標準差
    MEAN = mean(allAtr);  % 求均值
    x = (allAtr-MEAN)/STD;
    Samples2(:,i)=x;
end
end

代碼執行結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章