KNN算法图解(MATLAB实例)

来源:互联网 发布:微信矩阵管理平台 编辑:程序博客网 时间:2024/06/05 18:30

一、概念

kNN算法的核心思想是,当一个样本空间中有未知数据类型的样本,那么就可以根据离这个样本最邻近的k个样本的数据类型来确定样本的数据类型。

多维空间的KNN算法方程式可表示为:

 

 


这里是我详细讲述KNN算法的理论帖的网址 : http://blog.csdn.net/lx85416281/article/details/40656877

二、实例

例题:‘+’ 和 ‘0’ 是两种不一样的点,假如未知点用KNN算法识别为 ‘+’ 时,就把未知点标为 黑点’ . ’  。

 

K=1时:

 

 

设 K=3时:

 

 

设 K=5时:

 

 

 

K=11时:

 

 

 

 

三、MATLAB代码

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),'+');  %取data1(:,1)一个冒号是缺省表达,代表默认从1到最大的数值

label1=ones(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;

 

data=[data1;data2];

label=[label1;label2];

 

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

        for i=1:200

            distance(i)=sqrt((test_data(1)-data(i,1)).^2+(test_data(2)-data(i,2)).^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

 

0 0
原创粉丝点击