K最临近分类算法.docx
《K最临近分类算法.docx》由会员分享,可在线阅读,更多相关《K最临近分类算法.docx(38页珍藏版)》请在三一办公上搜索。
1、K最临近分类算法数据挖掘实验报告 K-最临近分类算法 学号:311062202 姓名:汪文娟 一、 数据源说明 1.数据理解 选择第二包数据Iris Data Set,共有150组数据,考虑到训练数据集的随机性和多样性,选择rowNo模3不等于0的100组作为训练数据集,剩下的50组做测试数据集。 。 b) 噪声数据:本文暂没考虑。 二、 K-最临近分类算法 KNN(k Nearest Neighbors)算法又叫k最临近方法,假设每一个类包含多个样本数据,而且每个数据都有一个唯一的类标记表示这些样本是属于哪一个分类, KNN就是计算每个样本数据到待分类数据的距离,如果一个样本在特征空间中的k
2、个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。因此,采用这种方法可以较好地避免样本的不平衡问题。另外,由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。 该方法的不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是事
3、先对已知样本点进行剪辑,事先去除对分类作用不大的样本。该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。 算法思路: K-最临近分类方法存放所有的训练样本,在接受待分类的新样本之前不需构造模型,并且直到新的样本需要分类时才建立分类。K-最临近分类基于类比学习,其训练样本由N维数值属性描述,每个样本代表N维空间的一个点。这样,所有训练样本都存放在N维模式空间中。给定一个未知样本,k-最临近分类法搜索模式空间,找出最接近未知样本的K个训练样本。这K个训练样本是未知样本的K个“近邻”。“临近性”又称为相异度,由欧几里德距离定义,其中两个点 X和Y的
4、欧几里德距离是: D(x,y)=(x1-y1)2+(x2-y2)2+.+(xn-yn)2 未知样本被分配到K个最临近者中最公共的类。在最简单的情况下,也就是当K=1时,未知样本被指定到模式空间中与之最临近的训练样本的类。 算法步骤: step.1-初始化距离为最大值 step.2-计算未知样本和每个训练样本的距离dist step.3-得到目前K个最临近样本中的最大距离maxdist step.4-如果dist小于maxdist,则将该训练样本作为K-最近邻样本 step.5-重复步骤2、3、4,直到未知样本和所有训练样本的距离都算完 step.6-统计K-最近邻样本中每个类标号出现的次数 s
5、tep.7-选择出现频率最大的类标号作为未知样本的类标号 三、 算法源代码 / / / KNN.cpp K-最近邻分类算法 / / #include #include #include #include #include #include #include / / / 宏定义 / / #define ATTR_NUM 4 /属性数目 #define MAX_SIZE_OF_TRAINING_SET 1000 /训练数据集的最大大小 #define MAX_SIZE_OF_TEST_SET 100 /测试数据集的最大大小 #define MAX_VALUE 10000.0 /属性最大值 #def
6、ine K 7 /结构体 struct dataVector ; struct distanceStruct ; / / / 全局变量 / / struct dataVector gTrainingSetMAX_SIZE_OF_TRAINING_SET; /训练数据集 struct dataVector gTestSetMAX_SIZE_OF_TEST_SET; /测试数据集 struct distanceStruct gNearestDistanceK; /K个最近邻距离 int ID; /ID号 double distance; /距离 char classLabel15; /分类标号 i
7、nt ID; /ID号 char classLabel15; /分类标号 double attributesATTR_NUM; /属性 int curTrainingSetSize=0; /训练数据集的大小 int curTestSetSize=0; /测试数据集的大小 / / / 求 vector1=(x1,x2,.,xn)和vector2=(y1,y2,.,yn)的欧几里德距离 / / double Distance(struct dataVector vector1,struct dataVector vector2) / / / 得到gNearestDistance中的最大距离,返回下
8、标 / / int GetMaxDistance / / / 对未知样本Sample分类 / / char* Classify(struct dataVector Sample) double dist=0; int maxid=0,freqK,i,tmpfreq=1; char *curClassLable=gNearestDistance0.classLabel; memset(freq,1,sizeof(freq); /step.1-初始化距离为最大值 for(i=0;iK;i+) int maxNo=0; for(int i=1;igNearestDistancemaxNo.dista
9、nce) maxNo = i; double dist,sum=0.0; for(int i=0;iATTR_NUM;i+) dist=sqrt(sum); return dist; sum+=(vector1.attributesi-vector2.attributesi)*(vector1.attributesi-vector2.attributesi); return maxNo; / / / 主函数 / /step.2-计算K-最近邻距离 for(i=0;icurTrainingSetSize;i+) /step.3-统计每个类出现的次数 for(i=0;iK;i+) /step.4-
10、选择出现频率最大的类标号 for(i=0;itmpfreq) tmpfreq=freqi; curClassLable=gNearestDistancei.classLabel; for(int j=0;jK;j+) if(i!=j)&(strcmp(gNearestDistancei.classLabel,gNearestDistancej.classLabel)=0) freqi+=1; /step.2.1-计算未知样本和每个训练样本的距离 dist=Distance(gTrainingSeti,Sample); /step.2.2-得到gNearestDistance中的最大距离 max
11、id=GetMaxDistance; /step.2.3-如果距离小于gNearestDistance中的最大距离,则将该样本作为K-最近邻样本 if(distgNearestDistancemaxid.distance) gNearestDistancemaxid.ID=gTrainingSeti.ID; gNearestDistancemaxid.distance=dist; strcpy(gNearestDistancemaxid.classLabel,gTrainingSeti.classLabel); gNearestDistancei.distance=MAX_VALUE; / v
12、oid main char c; int i,j, rowNo=0,TruePositive=0,FalsePositive=0; ifstream filein(iris.data); FILE *fp; if(filein.fail)coutCant open data.txt=MAX_SIZE_OF_TRAINING_SET) coutThe break ; training set has MAX_SIZE_OF_TRAINING_SET char *classLabel=; examples!endlendl; /rowNo%3!=0的100组数据作为训练数据集 if(rowNo%3
13、!=0) /剩下rowNo%3=0的50组做测试数据集 else if(rowNo%3=0) gTestSetcurTestSetSize.ID=rowNo; for(int i = 0;i gTestSetcurTestSetSize.attributesi; fileinc; gTrainingSetcurTrainingSetSize.ID=rowNo; for(int i = 0;i gTrainingSetcurTrainingSetSize.attributesi; fileinc; fileingTrainingSetcurTrainingSetSize.classLabel;
14、curTrainingSetSize+; fileingTestSetcurTestSetSize.classLabel; curTestSetSize+; filein.close; /step.2-KNN算法进行分类,并将结果写到文件iris_OutPut.txt fp=fopen(iris_OutPut.txt,w+t); /用KNN算法进行分类 fprintf(fp,*程序说明 *n); fprintf(fp,* 采用KNN算法对iris.data分类。为了操作方便,对各组数据添加rowNo属性,第一组fprintf(fp,* 共有150组数据,选择rowNo模3不等于0的100组作为
15、训练数据集,剩下的50组做测fprintf(fp,*fprintf(fp,*for(i=0;icurTestSetSize;i+) 第%d组数据实验结果rowNo=1!n); 试数据集n); *nn); *nn); fprintf(fp,*n,i+1); coutclassLabel(正确类标号: ; coutgTestSeti.classLabel)n; fprintf(fp,rowNo: %3d t KNN classLabel =Classify(gTestSeti); coutrowNo: ; coutgTestSeti.ID t; coutKNN分类结果: ; TruePositiv
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 临近 分类 算法

链接地址:https://www.31ppt.com/p-3160191.html