k阶近邻knn
k最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
close all;
clc;
%正态分布mu
%标准差sigma
%mvnrnd(mu,sigma,m);返回m个随机数
mu=[2 2];
sigma=[1 2];
%训练集数据
traindata1=mvnrnd(mu,sigma,100);
traindata2=mvnrnd(mu,sigma,100);
traindata3=mvnrnd(mu,sigma,100);
traindata(:,:,1)=traindata1;
traindata(:,:,2)=traindata2;
traindata(:,:,3)=traindata3;
trainDim=size(traindata);
testData=[2 3];%设置一个测试点
%plot(traindata1(:,1),traindata1(:,2),'o');
k=20;
%把测试点扩展成矩阵
testData_rep=repmat(testData,100,1);
diff1=(traindata(:,:,1)-testData_rep).^2;
diff2=(traindata(:,:,2)-testData_rep).^2;
diff3=(traindata(:,:,3)-testData_rep).^2;
%设置三个一维数组存放欧式距离
distance1=(diff1(:,1)+diff2(:,2)).^0.5;
distance2=(diff1(:,1)+diff2(:,2)).^0.5;
distance3=(diff1(:,1)+diff2(:,2)).^0.5;
%将三个一维数组合成一个二维矩阵
temp=[distance1 distance2 distance3];
%B = reshape(A,m,n) 将矩阵A的元素返回到一个m×n的矩阵B。如果A中没有m×n个元素则返回一个错误。
%将二维矩阵转换为一维数组
distance=reshape(temp,1,100*3);
%对距离进行排序
distance_sort=sort(distance);
%用循环寻找最小的k个距离里面那个类里出现的频率最高,并返回该类
num1=0;%第一类出现的次数
num2=0;
num3=0;
sum=0;%num1,num2,num3的和
for i=1:k
for j=1:100
if distance1(j)==distance_sort(i)
num1=num1+1;
end
if distance2(j)==distance_sort(i)
num2=num2+1;
end
if distance3(j)==distance_sort(i)
end
end
sum=sum+num1+num2+num3;
if sum>=k
break;
end
end
class=[num1 num2 num3];
classname=find(class(1,:)==max(class));
fprintf('测试点(%f %f)属于第%d类',testData(1),testData(2),classname);
%%使用绘图将训练集点和测试集点绘画出来
figure(1);
hold on;
for i=1:100
plot(traindata1(i,1),traindata1(i,2),'*');
plot(traindata2(i,1),traindata2(i,2),'o');
plot(traindata3(i,1),traindata3(i,2),'<');
end
plot(testData(1),testData(2),'x');
legend('第一类','第二类','第三类','测试点');
text(testData(1),testData(2),'测试点');
测试点(2.000000 3.000000)属于第1类测试点(2.000000 >> 

浙公网安备 33010602011771号