您好,欢迎访问三七文档
数据挖掘实验报告——K-最临近分类算法学号:108060894姓名:沈洁一、数据源说明1.数据理解选择第二包数据IrisDataSet,共有150组数据,考虑到训练数据集的随机性和多样性,选择rowNo模3不等于0的100组作为训练数据集,剩下的50组做测试数据集。(1)每组数据有5个属性,分别是:1.sepallengthincm2.sepalwrowNothincm3.petallengthincm4.petalwrowNothincm5.class:--IrisSetosa--IrisVersicolour--IrisVirginica(2)为了操作方便,对各组数据添加rowNo属性,且第一组rowNo=1。2.数据清理现实世界的数据一般是不完整的、有噪声的和不一致的。数据清理例程试图填充缺失的值,光滑噪声并识别离群点,并纠正数据中的不一致。a)缺失值:当数据中存在缺失值是,忽略该元组(注意:本文选用的第二组数据IrisDataSet的MissingAttributeValues:None)。b)噪声数据:本文暂没考虑。二、K-最临近分类算法KNN(kNearestNeighbors)算法又叫k最临近方法,假设每一个类包含多个样本数据,而且每个数据都有一个唯一的类标记表示这些样本是属于哪一个分类,KNN就是计算每个样本数据到待分类数据的距离,如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。因此,采用这种方法可以较好地避免样本的不平衡问题。另外,由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。该方法的不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。(1)算法思路:K-最临近分类方法存放所有的训练样本,在接受待分类的新样本之前不需构造模型,并且直到新的(未标记的)样本需要分类时才建立分类。K-最临近分类基于类比学习,其训练样本由N维数值属性描述,每个样本代表N维空间的一个点。这样,所有训练样本都存放在N维模式空间中。给定一个未知样本,k-最临近分类法搜索模式空间,找出最接近未知样本的K个训练样本。这K个训练样本是未知样本的K个“近邻”。“临近性”又称为相异度(Dissimilarity),由欧几里德距离定义,其中两个点X(x1,x2,…xn)和Y(y1,y2,…yn)的欧几里德距离是:2222211)(...)()(),(nnyxyxyxyxD未知样本被分配到K个最临近者中最公共的类。在最简单的情况下,也就是当K=1时,未知样本被指定到模式空间中与之最临近的训练样本的类。(2)算法步骤:step.1---初始化距离为最大值step.2---计算未知样本和每个训练样本的距离diststep.3---得到目前K个最临近样本中的最大距离maxdiststep.4---如果dist小于maxdist,则将该训练样本作为K-最近邻样本step.5---重复步骤2、3、4,直到未知样本和所有训练样本的距离都算完step.6---统计K-最近邻样本中每个类标号出现的次数step.7---选择出现频率最大的类标号作为未知样本的类标号三、算法源代码////////////////////////////////////////////////////////////////////////////////////////////////////////////KNN.cppK-最近邻分类算法//////////////////////////////////////////////////////////////////////////////////////////////////////////#includestdlib.h#includestdio.h#includememory.h#includestring.h#includeiostream.h#includemath.h#includefstream.h////////////////////////////////////////////////////////////////////////////////////////////////////////////宏定义//////////////////////////////////////////////////////////////////////////////////////////////////////////#defineATTR_NUM4//属性数目#defineMAX_SIZE_OF_TRAINING_SET1000//训练数据集的最大大小#defineMAX_SIZE_OF_TEST_SET100//测试数据集的最大大小#defineMAX_VALUE10000.0//属性最大值#defineK7//结构体structdataVector{intID;//ID号charclassLabel[15];//分类标号doubleattributes[ATTR_NUM];//属性};structdistanceStruct{intID;//ID号doubledistance;//距离charclassLabel[15];//分类标号};////////////////////////////////////////////////////////////////////////////////////////////////////////////全局变量//////////////////////////////////////////////////////////////////////////////////////////////////////////structdataVectorgTrainingSet[MAX_SIZE_OF_TRAINING_SET];//训练数据集structdataVectorgTestSet[MAX_SIZE_OF_TEST_SET];//测试数据集structdistanceStructgNearestDistance[K];//K个最近邻距离intcurTrainingSetSize=0;//训练数据集的大小intcurTestSetSize=0;//测试数据集的大小////////////////////////////////////////////////////////////////////////////////////////////////////////////求vector1=(x1,x2,...,xn)和vector2=(y1,y2,...,yn)的欧几里德距离//////////////////////////////////////////////////////////////////////////////////////////////////////////doubleDistance(structdataVectorvector1,structdataVectorvector2){doubledist,sum=0.0;for(inti=0;iATTR_NUM;i++){sum+=(vector1.attributes[i]-vector2.attributes[i])*(vector1.attributes[i]-vector2.attributes[i]);}dist=sqrt(sum);returndist;}////////////////////////////////////////////////////////////////////////////////////////////////////////////得到gNearestDistance中的最大距离,返回下标//////////////////////////////////////////////////////////////////////////////////////////////////////////intGetMaxDistance(){intmaxNo=0;for(inti=1;iK;i++){if(gNearestDistance[i].distancegNearestDistance[maxNo].distance)maxNo=i;}returnmaxNo;}////////////////////////////////////////////////////////////////////////////////////////////////////////////对未知样本Sample分类//////////////////////////////////////////////////////////////////////////////////////////////////////////char*Classify(structdataVectorSample){doubledist=0;intmaxid=0,freq[K],i,tmpfreq=1;;char*curClassLable=gNearestDistance[0].classLabel;memset(freq,1,sizeof(freq));//step.1---初始化距离为最大值for(i=0;iK;i++){gNearestDistance[i].distance=MAX_VALUE;}//step.2---计算K-最近邻距离for(i=0;icurTrainingSetSize;i++){//step.2.1---计算未知样本和每个训练样本的距离dist=Distance(gTrainingSet[i],Sample);//step.2.2---得到gNearestDistance中的最大距离maxid=GetMaxDistance();//step.2.3---如果距离小于gNearestDistance中的最大距离,则将该样本作为K-最近邻样本if(distgNearestDistance[maxid].distance){gNearestDistance[maxid].ID=gTrainingSet[i].ID;gNearestDistance[maxid].distance=dist;strcpy(gNearestDistance[maxid].classLabel,gTrainingSet[i].classLabel);}}//step.3---统计每个类出现的次数for(i=0;iK;i++){for(intj=0;jK;j++){if((i!=j)&&(strcmp(gNearestDistance[i].classLabel,gNearestDistance[j].classLabel)==0)){freq[i]+=1;}}}//step.4---选择出现频率最大的类标号for(i=0;iK;i++){if(freq[i]tmpfreq){tmpfreq=freq[i];curClassLable=gNearestDistance[i].classLabel;}}returncurClass
本文标题:数据挖掘实验报告
链接地址:https://www.777doc.com/doc-5118826 .html