Matlab之KNN实现

来源:互联网 发布:化妆品网络推广方案 编辑:程序博客网 时间:2024/05/18 01:52

1.     算法流程

1)      通过Matlab产生高斯分布产生两类数据,并标明类别

2)      数据初始化:设置K=某个常数(一般为奇数)

3)      对于每个测试数据,

计算其到两类数据的所有点的距离

对于上述求得的距离,选出K个最小的,

检测这选出的K个值中属于类别1和类别2的个数

If Cnt1>Cnt2

          属于类别1;

Else

          属于类别2;


2、实验代码:

clear all;
close all;
clc;

%%第一个类数据和标号
mu1=[0 0];  %均值
S1=[0.3 0;0 0.35];  %协方差
data1=mvnrnd(mu1,S1,100);   %产生高斯分布数据
plot(data1(:,1),data1(:,2),'+');
label1=ones(100,1); %产生100行1列的单位矩阵
hold on;

%%第二个类数据和标号
mu2=[1.25 1.25];
S2=[0.3 0;0 0.35];
data2=mvnrnd(mu2,S2,100);
plot(data2(:,1),data2(:,2),'ro');
label2=label1+1; %产生100行1列的全为2的矩阵

data=[data1;data2];%数据合并
label=[label1;label2];
grid on;

K=11;   %两个类,K取奇数才能够区分测试数据属于那个类

%测试数据,KNN算法看这个数属于哪个类
for ii=-3:0.1:3
    for jj=-3:0.1:3
        test_data=[ii jj];  %测试数据
        label=[label1;label2];
        %%下面开始KNN算法,显然这里是11NN。
        %求测试数据和类中每个数据的距离,欧式距离(或马氏距离) 
        distance=zeros(200,1); %产生200行1列的零矩阵
        for i=1:200
            distance(i)=sqrt((test_data(1)-data(i,1)).^2+(test_data(2)-data(i,2)).^2); %(xi-X)2+(yj-Y)2
        end

        %选择排序法,只找出最小的前K个数据,对数据和标号都进行排序
        for i=1:K
            ma=distance(i);
            for j=i+1:200
                if distance(j)<ma
                    ma=distance(j);
                    label_ma=label(j);
                    tmp=j;
                end
            end
            distance(tmp)=distance(i);  %排数据
            distance(i)=ma;


            label(tmp)=label(i);        %排标号,主要使用标号
            label(i)=label_ma;
        end

        cls1=0; %统计类1中距离测试数据最近的个数
        for i=1:K
           if label(i)==1
               cls1=cls1+1;
           end
        end
        cls2=K-cls1;    %类2中距离测试数据最近的个数
        
        if cls1>cls2    
           plot(ii,jj);     %属于类1的数据画小黑点
        end
        
    end
end

 

3、结果说明

 本算法的测试数据是坐标轴上的点,范围是x[-3,3], y[-3,3];

最终结果一类用黑点表示,一类用空白表示


4、算法结果:

 


0 0
原创粉丝点击