首页 > 技术文章 > k阶近邻knn

zuiaimiusi 2019-08-06 23:52 原文

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

 

 

 

推荐阅读