zoukankan      html  css  js  c++  java
  • k阶近邻knn

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

     
  • 相关阅读:
    【VS开发】CListCtrl控件使用方法总结
    【VS开发】CListCtrl控件使用方法总结
    【VS开发】CTabView多页卡界面
    【VS开发】CTabView多页卡界面
    【VS开发】关于在CFormView中实现CListCtrl控件的注意事项
    【VS开发】关于在CFormView中实现CListCtrl控件的注意事项
    【VS开发】list控件的InsertColumn方法出错
    【VS开发】list控件的InsertColumn方法出错
    【VS开发】CListCtrl控件使用
    【VS开发】CListCtrl控件使用
  • 原文地址:https://www.cnblogs.com/zuiaimiusi/p/11312638.html
Copyright © 2011-2022 走看看