(参考:【CSDN】http://blog.csdn.net/llp1992)代码是基于别人的代码进行了一点小修改 ,作自己学习记录用。
function relustLabel = KNN(test_data,train_data,labels,k)
% inx 为 输入测试数据,data为样本数据,labels为样本标签
[datarow , datacol] = size(train_data);%size返回数据矩阵的行数和列数
diffMat = repmat(test_data,[datarow,1]) - train_data ;
distanceMat = sqrt(sum(diffMat.^2,2));%求距离,返回每一行的和
[B , IX] = sort(distanceMat,'ascend');%ascend 升序排列,B排序后矩阵,IX在原矩阵中的索引
len = min(k,length(B));
relustLabel = mode(labels(IX(1:len)));%mode返回众数,即标号多的类
end
clc
clear
close all
total_data=load('C:\Users\zan\Desktop\matlab_drive\machine-learnning\KNN\iris_data.mat');
len = size(total_data.features,1);
rand_num=randperm(len);
ratio=0.7;
train_num=ratio*len;
test_num=len-train_num;
data_mat = total_data.features;%属性
labels = total_data.classes;%类
k = 5;
error = 0;
% 归一化处理
maxV = max(data_mat);
minV = min(data_mat);
range = maxV-minV;
newdataMat = (data_mat-repmat(minV,[len,1]))./(repmat(range,[len,1]));
% 测试
for i = 1:test_num
classifyresult = KNN(newdataMat(rand_num(train_num+i),:),newdataMat(rand_num(1:train_num),:),labels(rand_num(1:train_num),:),k);
fprintf('测试结果为:%d 真实结果为:%d\n',[classifyresult labels(rand_num(train_num+i))])
if(classifyresult~=labels(rand_num(train_num+i)))
error = error+1;
end
end
fprintf('准确率为:%f\n',1-error/(test_num))