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 >>