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
代码执行结果: