k-邻近算法

来源:互联网 发布:淘宝c店双11报名条件 编辑:程序博客网 时间:2024/04/20 08:39

首先介绍最邻近算法

   已知N个已知类别样本,计算待识别样本x与已知样本xi之间的距离,将它判为距离最近那个样本所属的类。

 

k-近邻算法:

  已知N个已知类别样本,计算待识别样本x与已知样本xi之间的距离,取k个最近相邻样本,这k个样本属于哪个类最多,待识别样本就属于该类。

 

剪辑最近邻算法

第一步:k-NN进行样本剪辑

第二部:1-NN进行样本分类

    如果样本足够多,就可以重复执行剪辑程序,以进一步提高分类性能,称为重复剪辑最近邻算法

 

对于k-NN算法,当样本数目过大时,效率非常低,发展了层次kNN和kdtree kNN,它们都是通过对树进行剪枝达到提高搜索效率的目的。

   hknn的剪枝原理是(以最近邻问题为例),如果目标点d与当前最近邻点x的距离,小于d与某结点Kp中心的距离加上Kp的半径,那么结点Kp中的任何一点到目标点的距离都会大于d与当前最近邻点的距离,从而它们不可能是最近邻点(K近邻问题类似于它),这个结点可以被排除掉。

   kdtree对样本集所在超平面进行划分成子超平面,剪枝原理是, 如果某个子超平面与目标点d的最近距离大于d与当前最近点x的距离,则该超平面上的点到d的距离都大于当前最近邻点,从而被剪掉。

 

knn算法:

typedef double(*d)(double*,double*,int);//距离度量算法自定义

bool KnnAlgorithm(double* sample,double *data,int dimen,int N,int num,d op)
{
 double *dis=new double[num];
 int *index=new int[num];
 for(int i=0;i<N; i++)
 {
   double* feature=new double[dimen];
   for(int j=0;j<N;j++)
    feature[j]=data[i*(dimen+1)+j];
   double distance=op(sample,feature,dimen);

   for(int k=num-1;k>=0;k--)
   {
    if(distance<dis[k]) break;
    else
    {
      if(k=num-1)
   {
     dis[k]=distance;
     index[k]=i;
   }
   else
   {
     dis[k+1]=dis[k];index[k+1]=index[k];
     dis[k]=distance;index[k]=i;
   }
    }
   }
 }

 int sum[2];
 sum[0]=sum[1]=0;
 for(int i=0;i<num;i++)
 {
 int label=(int)data[index[i]*(dimen+1)+dimen];
 if(label==1) sum[0]++;
 else         sum[1]++;
 }

 if(sum[0]>sum[1]) return true;
 else              return false;
}

 

 

 

 

原创粉丝点击