首先介绍最邻近算法
已知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;
}