实验一****孤立点识别一
实验类型:验证性
实验学时:2
一、实验目的
1.熟练掌握基于距离的孤立点识别算法的实现。
2.熟练掌握C语言的使用(特别是结构和数组的使用)。
二、实验设备
Windows计算机、VC++6.0开发工具。
三、实验原理
使用C语言进行基于距离的孤立点识别算法的编写。首先,将文本文件中的二维数据点读入内存;然后对每个数据点,根据距离公式测量其与其它数据点的距离,如果距离低于某个设定的阈值,就将该数据点的密度值增加1,如果距离高于某个设定的阈值,不做任何处理;最后统计各个数据点的密度值,如果密度值高于某个设定的阈值,则该数据点就是高密度点,作为有效数据处理,如果密度值低于某个设定的阈值,则该数据点就是低密度点,作为噪声或孤立点处理。
四、实验内容与步骤
1.利用基于距离的孤立点识别算法识别出孤立点和有效数据。
2.将识别出的孤立点和有效数据导入到Excel中,画二维图进行查看结果。
3.根据二维图查看的结果进行算法参数的调整,直到找出合适的参数。
五、思考题
1、如何使用其它距离公式进行算法的改写?
2、怎样减少参数对实验结果的影响?
六、实验报告
1、给出基于距离的孤立点识别算法的实验步骤。
2、回答预习中的思考题。
七、核心代码
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
{
if((point[i].x==point[j].x)&&(point[i].y==point[j].y)) ;
else
{
dis=sqrt(abs(point[i].x-point[j].x)abs(point[i].x-point[j].x)+abs(point[i].y-point[j].y)abs(point[i].y-point[j].y));
if(dis } } 实验二****孤立点识别二 实验类型:验证性 实验学时:2 一、实验目的 1.熟练掌握基于网格的孤立点识别算法的实现。 2.熟练掌握C语言的使用(特别是结构和指针的使用)。 二、实验设备 Windows计算机、VC++6.0开发工具。 三、实验原理 使用C语言进行基于网格的孤立点识别算法的编写。首先,将文本文件中的二维数据点读入内存,根据数据点的坐标进行网格单元的划分;然后将每个数据点映射到相应的网格单元中,并计算每个网格单元的密度;最后扫描每个网格单元,如果其密度高于某个设定的阈值,就将该网格单元作为高密度单元,该单元中的数据点作为有效数据处理,否则作为低密度单元,相应的数据点作为孤立点处理。 四、实验内容与步骤 1.利用基于网格的孤立点识别算法识别出孤立点和有效数据。 2.将识别出的孤立点和有效数据导入到Excel中,画二维图进行查看结果。 五、思考题 1、网格算法识别孤立点的优势是什么? 2、怎样减少参数对实验结果的影响? 六、实验报告 1、给出基于网格的孤立点识别算法的实验步骤。 2、回答预习中的思考题。 七、核心代码 for(i=1;i<=pointsum;i++) //将每个点映射到单元中 { fread(&stud,sizeof(struct subnode),1,fp); px=atoi(stud.a); py=atoi(stud.b); cellnum=(py/d1)*k+(px/d1)+1; tail[cellnum]->next=new node; tail[cellnum]->next->next=NULL; tail[cellnum]=tail[cellnum]->next; tail[cellnum]->x=px; tail[cellnum]->y=py; rect[cellnum].count++; } for(i=1;i<=k*k;i++) //检查高密度的单元 if (rect[i].count>=minspan) { rect[i].high=1; rect[i].prior=1; } else rect[i].low=1; for(i=1;i<=k*k;i++) { if(rect[i].count>swap) swap=rect[i].count; } fprintf(fp,"数据集中的噪声情况如下:\n"); for(i=1;i<=k*k;i++) { if (rect[i].count!=0) { neighbour(i); if ((rect[i].low==1)&&(rect[i].cellneighbour[0].n==0)) //孤立点 rect[i].flag1=1; if ((rect[i].low==1)&&(rect[i].cellneighbour[0].n==1)) //考虑该单元的子单元 { neighbour1(i); //该单元的左上子单元 neighbour2(i); //右上子单元 neighbour3(i); //左下子单元 neighbour4(i); //右下子单元 computerxy(i); //计算i单元在x,y轴上的坐标 for(j=1;j<=rect[i].count;j++) { if (center[i]->next!=NULL) { if ((center[i]->next->x)>=(rect[i].x1+d2)) //右半部 { if ((center[i]->next->y)>=(rect[i].y1+d2)) //右上部 combine(rect[i].subneighbour2,center[i]); else combine(rect[i].subneighbour4,center[i]); } else if ((center[i]->next->y)>=(rect[i].y1+d2)) //左上部 combine(rect[i].subneighbour1,center[i]); else combine(rect[i].subneighbour3,center[i]); center[i]=center[i]->next; } } } } } 实验三****基于距离和密度的聚类分析 实验类型:验证性 实验学时:2 一、实验目的 1.熟练掌握基于距离和密度的聚类算法的实现。 2.熟练掌握C语言的使用(特别是结构和数组的使用)。 二、实验设备 Windows计算机、VC++6.0开发工具。 三、实验原理 使用C语言进行基于距离和密度的聚类算法的编写。首先,利用基于距离的孤立点算法去除数据集中的孤立点;然后对去除孤立点后的数据集中的每个数据点A,根据距离公式测量其与其它数据点B的距离,如果从A到B的距离低于设定的阈值,就将数据点A和B归于一类,否则不做任何处理;最后统计出各个类的数据点数,如果低于给定的阈值,就将这个类中的数据作为噪声处理。 四、实验内容与步骤 1.利用基于距离和密度聚类算法识别出数据集中的每个类。 2.将识别出的孤立点和有效数据导入到Excel中,画二维图进行查看结果。 五、思考题 1、基于距离和密度的聚类算法有什么缺点? 2、怎样减少参数对实验结果的影响? 六、实验报告 1、给出基于距离和密度的聚类算法的实验步骤。 2、回答预习中的思考题。 七、核心代码 for(i=1;i<=N;i++) for(j=1;j<=N;j++) { if((point[i].x==point[j].x)&&(point[i].y==point[j].y)) ; else { dis=sqrt(abs(point[i].x-point[j].x)abs(point[i].x-point[j].x)+abs(point[i].y-point[j].y)abs(point[i].y-point[j].y)); if(dis { if(point[i].flag>point[j].flag) point[i].flag=point[j].flag; if(point[i].flag } } } 实验四****网格聚类分析一 实验类型:验证性 实验学时:3 一、实验目的 1.熟练掌握基于网格的聚类算法的实现。 2.熟练掌握C语言的使用(特别是结构和指针的使用)。 二、实验设备 Windows计算机、VC++6.0开发工具。 三、实验原理 使用C语言进行基于网格的聚类算法的编写。首先,将文本文件中的二维数据点读入内存,根据数据点的坐标进行网格单元的划分;然后将每个数据点映射到相应的网格单元中,并计算每个网格单元的密度;最后扫描每个网格单元,如果其密度高于某个设定的阈值,就将该网格单元作为高密度单元,该单元中的数据点作为有效数据处理,否则作为低密度单元,相应的数据点作为孤立点处理。将相邻的高密度单元连接起来,且单元中相应的数据点归于一类。 四、实验内容与步骤 1.利用基于网格的聚类算法识别出数据集中的孤立点和类。 2.将识别出的孤立点和有效数据导入到Excel中,画二维图进行查看结果。 五、思考题 1、网格聚类算法的优势是什么? 2、怎样减少参数对实验结果的影响? 六、实验报告 1、给出基于网格的聚类算法的实验步骤。 2、回答预习中的思考题。 七、核心代码 for(i=1;i<=pointsum;i++) //将每个点映射到单元中 { fread(&stud,sizeof(struct subnode),1,fp); px=atoi(stud.a); py=atoi(stud.b); cellnum=(py/d1)*k+(px/d1)+1; tail[cellnum]->next=new node; tail[cellnum]->next->next=NULL; tail[cellnum]=tail[cellnum]->next; tail[cellnum]->x=px; tail[cellnum]->y=py; rect[cellnum].count++; } for(i=1;i<=k*k;i++) //检查高密度的单元 if (rect[i].count>=minspan) { rect[i].high=1; rect[i].prior=1; } else rect[i].low=1; for(i=1;i<=k*k;i++) { if(rect[i].count>swap) swap=rect[i].count; } fprintf(fp,"数据集中的噪声情况如下:\n"); for(i=1;i<=k*k;i++) { if (rect[i].count!=0){ neighbour(i); if ((rect[i].low==1)&&(rect[i].cellneighbour[0].n==0)) //孤立点 rect[i].flag1=1; if ((rect[i].low==1)&&(rect[i].cellneighbour[0].n==1)) //考虑该单元的子单元 { neighbour1(i); //该单元的左上子单元 neighbour2(i); //右上子单元 neighbour3(i); //左下子单元 neighbour4(i); //右下子单元 computerxy(i); //计算i单元在x,y轴上的坐标 for(j=1;j<=rect[i].count;j++) { if (center[i]->next!=NULL) { if ((center[i]->next->x)>=(rect[i].x1+d2)) //右半部 { if ((center[i]->next->y)>=(rect[i].y1+d2)) //右上部 combine(rect[i].subneighbour2,center[i]); else combine(rect[i].subneighbour4,center[i]); } else if ((center[i]->next->y)>=(rect[i].y1+d2)) //左上部 combine(rect[i].subneighbour1,center[i]); else combine(rect[i].subneighbour3,center[i]); center[i]=center[i]->next; } } } } } 实验五****网格聚类分析二 实验类型:验证性 实验学时:3 一、实验目的 1.熟练掌握在基于网格的聚类算法中实现一定程度上的参数自动化的选取。 2.熟练掌握C语言的使用(特别是结构和指针的使用)。 二、实验设备 Windows计算机、VC++6.0开发工具。 三、实验原理 使用C语言进行基于网格的聚类算法的编写。首先,将文本文件中的二维数据点读入内存,根据数据点的坐标进行网格单元的划分;然后将每个数据点映射到相应的网格单元中,并计算每个网格单元的密度;最后扫描每个网格单元,如果其密度高于某个设定的阈值,就将该网格单元作为高密度单元,该单元中的数据点作为有效数据处理,否则作为低密度单元,相应的数据点作为孤立点处理。将相邻的高密度单元连接起来,且单元中相应的数据点归于一类。 四、实验内容与步骤 1.通过在网格聚类算法中应用参数自动化选取技术,识别出数据集中的孤立点和类。 2.将识别出的孤立点和有效数据导入到Excel中,画二维图进行查看结果。 五、思考题 1、参数自动化选取的优缺点是什么? 2、怎样减少参数对实验结果的影响? 六、实验报告 1、给出基于网格的聚类算法的实验步骤。 2、回答预习中的思考题。 七、核心代码 for(i=1;i<=pointsum;i++) //将每个点映射到单元中 { fread(&stud,sizeof(struct subnode),1,fp); px=atoi(stud.a); py=atoi(stud.b); cellnum=(py/d1)*k+(px/d1)+1; tail[cellnum]->next=new node; tail[cellnum]->next->next=NULL; tail[cellnum]=tail[cellnum]->next; tail[cellnum]->x=px; tail[cellnum]->y=py; rect[cellnum].count++; } for(i=1;i<=k*k;i++) //检查高密度的单元 if (rect[i].count>=minspan) { rect[i].high=1; rect[i].prior=1; } else rect[i].low=1; for(i=1;i<=k*k;i++) { if(rect[i].count>swap) swap=rect[i].count; } fprintf(fp,"数据集中的噪声情况如下:\n"); for(i=1;i<=k*k;i++) { if (rect[i].count!=0){ neighbour(i); if ((rect[i].low==1)&&(rect[i].cellneighbour[0].n==0)) //孤立点 rect[i].flag1=1; if ((rect[i].low==1)&&(rect[i].cellneighbour[0].n==1)) //考虑该单元的子单元、{ neighbour1(i); //该单元的左上子单元 neighbour2(i); //右上子单元 neighbour3(i); //左下子单元 neighbour4(i); //右下子单元 computerxy(i); //计算i单元在x,y轴上的坐标 for(j=1;j<=rect[i].count;j++) { if (center[i]->next!=NULL) { if ((center[i]->next->x)>=(rect[i].x1+d2)) //右半部 { if ((center[i]->next->y)>=(rect[i].y1+d2)) //右上部 combine(rect[i].subneighbour2,center[i]); else combine(rect[i].subneighbour4,center[i]); } else if ((center[i]->next->y)>=(rect[i].y1+d2)) //左上部 combine(rect[i].subneighbour1,center[i]); else combine(rect[i].subneighbour3,center[i]); center[i]=center[i]->next; } } } } }3.根据二维图查看的结果进行算法参数的调整,直到找出合适的参数。
3.根据二维图查看的结果进行算法参数的调整,直到找出合适的参数。
3.根据二维图查看的结果进行算法参数的调整,直到找出合适的参数。
3.根据二维图查看的结果进行算法参数的调整,直到找出合适的参数。