`
java-mans
  • 浏览: 11344286 次
文章分类
社区版块
存档分类
最新评论

KNN的matlab实现算法(转载)

 
阅读更多

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


%调入数据文件
load hw3;
%查看数据
whos;
m=500;
n=2;
%当k=1时分类结果total_error =50 right1 =497 right2 =477 right3 = 476
%当k=50时分类结果total_error =47 right1 =494 right2 =470 right3 = 489
%当k=10时分类结果total_error =39 right1 =495 right2 =477 right3 = 489
%当k=18,19,20时分类结果total_error =37 right1 =495 right2 =477 right3 = 491
%当k=16,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


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics