KNN的matlab实现算法

原文地址:KNN的matlab实现算法 作者:笨笨
      讨厌死matlab了,呵呵其实是不经常用导致简单的语法结构都忘了每次都要查来查去的。我今天差点就想改下我以前c++的那个算了,后来想这样可不好,不能因为惧怕而放弃。有什么嘛,就是多费点时间而已啊。还好今天写了不到3个小时搞定了。晚上的时候还有个朋友让过去帮看个神经网络的程序,头大呵呵,早就忘光光了,不过还是硬着头皮过去了,凭着仅有的一丁点的记忆,加上比较嘿嘿瞎猫碰到死老鼠竟然蒙过去了,不过为了负责起见自己回来又找了点内容看看。咦,模式识别还有作业看都没看呢,我干什么去了呢?管它呢,最后一天再看嘻嘻!真是欠扁。嗯,不废话了贴code吧。(前提是有hw3.mat数据集哦)

%调入数据文件

load hw3;

%查看数据

whos;

m=500;

n=2;

%k1时分类结果total_error =50 right1 =497 right2 =477 right3 = 476

%k50时分类结果total_error =47 right1 =494 right2 =470 right3 = 489

%k10时分类结果total_error =39 right1 =495 right2 =477 right3 = 489

%k18,19,20时分类结果total_error =37 right1 =495 right2 =477 right3 = 491

%k16,17时分类结果total_error =35 right1 =495 right2 =479 right3 = 491

k=16;

sum11=distance(m,n,t1,c1,k);%计算出t1中的样本和c1样本的欧式距离最近的前k个值

sum12=distance(m,n,t1,c2,k); %计算出t1中的样本和c2样本的欧式距离最近的前k个值

sum13=distance(m,n,t1,c3,k); %计算出t1中的样本和c3样本的欧式距离最近的前k个值

sum21=distance(m,n,t2,c1,k); %计算出t2中的样本和c1样本的欧式距离最近的前k个值

sum22=distance(m,n,t2,c2,k); %计算出t2中的样本和c2样本的欧式距离最近的前k个值

sum23=distance(m,n,t2,c3,k); %计算出t2中的样本和c3样本的欧式距离最近的前k个值

sum31=distance(m,n,t3,c1,k); %计算出t3中的样本和c1样本的欧式距离最近的前k个值

sum32=distance(m,n,t3,c2,k); %计算出t3中的样本和c2样本的欧式距离最近的前k个值

sum33=distance(m,n,t3,c3,k); %计算出t3中的样本和c3样本的欧式距离最近的前k个值

type1=classfy(sum11,sum12,sum13,k);%对t1中的样本进行分类

type2=classfy(sum21,sum22,sum23,k);%对t2中的样本进行分类

type3=classfy(sum31,sum32,sum33,k);%对t3中的样本进行分类

right1=class_right(type1,1,m) t1中正确分类的样本数

right2=class_right(type2,2,m) t2中正确分类的样本数

right3=class_right(type3,3,m) t3中正确分类的样本数

total_error=m*3-right1-right2-right3%总的分错样本数

 

 

%计算欧式距离(测试样本中的每个点距离每个训练样本的距离)

function [sum]=distance(m,n,test,c,k)

sum=zeros(m,m);

for i=1:1:m

    for t=1:1:m

        for j=1:1:n

            sum(i,t)=sum(i,t)+[test(i,j)-c(t,j)]*[test(i,j)-c(t,j)];

        end

        sum(i,t)=sqrt(sum(i,t));

    end

end

%并且进行排序得到距离较短的k个点来

for i=1:1:m

    for t=1:1:k

         min=t;

         for j=t+1:1:m

             if sum(i,j)<sum(i,min)

                 min=j;

             end

        end

              temp=sum(i,t);

              sum(i,t)=sum(i,min);

              sum(i,min)=temp;

     end

end

 

 

function[right]=class_right(type,t,m)

right=0;

for i=1:1:m

    if type(i)==t

        right=right+1;

    end

end

 

 

%分类器,判断测试样本属于真实分类的数目

function [type]=classfy(sum1,sum2,sum3,k)

m=500;

min11=zeros(m,1);

min12=zeros(m,1);

min13=zeros(m,1);

type=zeros(m,1);

for i=1:1:m

    for j=1:1:k

        for t=1:1:k

            if sum1(i,j)<sum2(i,t)&&sum1(i,j)<sum3(i,t)

           

                min11(i)=min11(i)+1;

       

            else if  sum2(i,t)<sum1(i,j)&&sum2(i,t)<sum3(i,t)

              

                    min12(i)=min12(i)+1;

           

                else

               

                    min13(i)=min13(i)+1;

          

                end

       

            end

   

        end

    end

    if min11(i)>min12(i)&&min11(i)>min13(i)

            type(i)=1;

        else if  min12(i)>min11(i)&&min12(i)>min13(i)

                type(i)=2;

            else

                type(i)=3;

            end

    end

end


 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值