1、1武汉大学国际软件学院实验报告课程名称 模式识别导论 专业年级 2015 级 姓 名 宁佳星 学 号 2015302580323 协 作 者 实验学期 2017-2018 学年 上 学期课堂时数 0 课外时数 12 填写时间 2017 年 11 月 12 日2实验概述【实验项目名称】:模式识别作业 1【实验目的】: 1、请编写程序实现混合类型属性差异性矩阵计算2、请编写程序实现近邻聚类算法或者最大最小距离聚类算法3、请编写程序实现层次聚类算法4、请编写程序实现 K-means 或者 K-中心点聚类算法5、请编写程序实现 ISODATA 算法6、使用统一的测试数据观察不同算法的聚类结果,并讨论为
2、什么【实验环境】(使用的软件): Windiws 7 Visual Studio 2017【参考资料】: 模式识别作业 1 模式识别 PPT 网络索引实验内容3【实验方案设计】: 1、编写程序实现混合类型属性差异性矩阵计算/矩阵三元组之矩阵相加 相乘.#define MAXSIZE 12500 /最大非零元素.void InputMatrix(TSMatrix /存放每行非零元素的个数int *rowStart = new intT.mu + 2; /矩阵每行在三元组开始位置int *temp = new intT.nu + 1; /存放结果矩阵中每行的计算结果.while (Current
3、theta*D12)./min-operatefor (j = 0; jtheta*D12) k+; centerk = index; / add a centertheshold = max;/ prepare to loop next time.3、编写程序实现层次聚类算法/实现层次聚类算法./计算两个样本点之间的欧几里得距离double CAgeneCluster:getDistance(sDataPoint dpA, sDataPoint dpB).list* CAgeneCluster:initialCluster(list *dataPoints).sDataPoint tempD
4、ataPoint = *iter;/取出数据, .tempCluster.clusterLabel = i; /初始类簇号为各原数据顺序号tempCluster.datapointList-push_back(tempDataPoint);/每一个数据为一类originalClusters-push_back(tempCluster);/originalClusters 为类簇序列.list* CAgeneCluster:mergeCluster(list* clusters, int mergeIndexA, int mergeIndexB)/mergeIndexA, B 是类簇标号.int
5、 nBreak = 0;/计算找到的次数,以提前退出循环,节省时间if (mergeIndexA != mergeIndexB)/分属于不同的类簇,则合并. / 将 clustermergeIndexB中的 DataPoint 加入到 clustermergeIndexAfor (list:iterator iter = clusters-begin(); iter != clusters-end(); iter+)/把 mergeIndexA 所在类簇提取出来。5tempCluster = *iter;/以下程序找出 mergeIndexA and B 所在类簇,并从链表中删除 B 类簇。i
6、f (tempCluster.clusterLabel = mergeIndexA)nBreak+;/计算找到的次数,以提前退出循环,节省时间tempClusterA = *iter;/end for if(tempCluster.clusterLabel=mergeIndexA)if (tempCluster.clusterLabel = mergeIndexB)/并从链表中删除 B 类簇。tempClusterB = *iter;nBreak+;/计算找到的次数,以提前退出循环,节省时间 .if (nBreak = 2)/找到两个类簇,则提前退出循环,节省时间。nBreak = 0;bre
7、ak;.dpA = tempClusterA.datapointList; /把 clusterA 中的数据集提取出来。.for (list:iterator iter = dpB-begin(); iter != dpB-end(); iter+) /取出数据 dpA-push_back(*iter);/把 B 中数据存入到 A.list* CAgeneCluster:startAnalysis(list *dataPoints, unsigned int ClusterNum).originalClusters = initialCluster(dataPoints);/数据集初始化;/o
8、riginalClusters 为类簇序列. printCluster(originalClusters);/打印聚类情况.while (finalClusters-size()ClusterNum)/聚类数为 ClusterNumdouble minDist = 9999999.9999;/maxvalue.if (iIter != jIter).dataPointsA = ClusterA.datapointList;/类簇中的数据集clusterLabelA = ClusterA.clusterLabel;/类簇标号dataPointsB = ClusterB.datapointList
9、;/类簇中的数据集clusterLabelB = ClusterB.clusterLabel;/类簇标号for (list:iterator iterdpA = dataPointsA-begin(); iterdpA != dataPointsA-end(); iterdpA+).if (tempDis t).for (int i = 0; i classes, Vect means).for (int i = 0; i init, Vect means).for (int i = 1; i init).newE = getE(classes, means); /计算当前准则函数值for (
10、int i = 0; i = 1)for (int i = 0; i data; /聚类的数据/计算该聚类的中心,即该类的均值void calMean()./计算该类样本点到该聚类中心得平均距离void calDist()./计算样本与中心的标准差void calStErr().;/获取数据void getData(Point p, int n)./设置参数的值9void setArgs()./寻找点 t 距离最近的类的中心对应的 idint FindIdx(vector /初始化类聚个数/初始化 nClusters 个类,设置相关数据.bool isLess = false; /标志是否有类
11、的数目低于 thetaNwhile (1)/先清空每一个聚类for (int i = 0; i c.at(i).sigma.y ? c.at(i).sigma.x : c.at(i).sigma.y;maxsigma.push_back(mt);.nClusters+;Cluster newCtr; /新的聚类中心/获取新的中心./改变老的中心./合并操作if (nClusters = 2 * args.expClusters | (iter /需要合并的聚类个数./进行排序sort(info, info + cnt, cmp);/找出 info 数组中距离刚好小于 thetaC 的 inde
12、x,那么 index 更小的更应该合并int iPos = FindPos(info, cnt, args.thetaC);/用于指示该位置的样本点是否已经合并bool *flag = new boolnClusters;memset(flag, false, sizeof(bool) * nClusters);/用于标记该位置的样本点是否已经合并删除bool *del = new boolnClusters;memset(del, false, sizeof(bool) * nClusters);/记录合并的次数int nTimes = 0;for (int i = 0; i bL) bre
13、ak;/将数目少的样本合并到数目多的样本中if (c.at(u).nSamples :iterator id = c.begin();11./合并多少次就删除多少个.int main().6、用统一的测试数据观察不同算法的聚类结果,并讨论为什么1 中矩阵运算的试验数据见下图(结果)2-5 中使用同同样的样本点数据测试,详情见下图,分析见小结相关数据:12【结论】(结果): 1、编写程序实现混合类型属性差异性矩阵计算2、编写程序实现近邻聚类算法或者最大最小距离聚类算法133、编写程序实现层次聚类算法1415164、编写程序实现 K-means 或者 K-中心点聚类算法5、编写程序实现 ISODA
14、TA 算法17【小结】: 实验要求算法基本实现,经完善后可正常运行计算 关于 2-5 中不同算法对相同数据的运算得到了略有有差别的结果 聚类的目标是使同一类对象的相似度尽可能地大;不同类对象之间的相似度尽可能地小 不同算法的根本思想具有一定的差异,因此导致了计算结果的差异 例如层次聚类 优点:适用于任意形状和任意属性的数据集;灵活控制不同层次的聚类粒度,强聚类能力 缺点:大大延长了算法的执行时间,不能回溯处理 例如 K-means 算法 优点:应用广泛;收敛速度快;能扩展以用于大规模的数据集 缺点:倾向于识别凸形分布、大小相近、密度相近的聚类;中心选择和噪声聚类对结果影响大 ISODATA 算
15、法是一种常用的聚类分析方法,是一种非监督学习方法。ISODATA 算法通过设置初始参数而引入人机对话环节,并使用归并和分裂等机制,当两类聚中心小于某个阀值时,将它们合并为一类。当某类的标准差大于某一阀值时或其样本数目超过某一阀值时,将其分裂为两类,在某类样本数目小于某一阀值时,将其取消。这样根据初始类聚中心和设定的类别数目等参数迭代,最终得到一个比较理想的分类结果。指导教师评语及成绩【评语】:成绩: 指导教师签名:批阅日期:18附件:实验报告说明1实验项目名称:要用最简练的语言反映实验的内容。要求与实验指导书中相一致。2实验目的:目的要明确,要抓住重点,符合实验任务书中的要求。3实验环境:实验用的软硬件环境(配置)。4实验方案设计(思路、步骤和方法等):这是实验报告极其重要的内容。包括概要设计、详细设计和核心算法说明及分析,系统开发工具等。应同时提交程序或设计电子版。对于设计型和综合型实验,在上述内容基础上还应该画出流程图、设计思路和设计方法,再配以相应的文字说明。对于创新型实验,还应注明其创新点、特色。5结论(结果):即根据实验过程中所见到的现象和测得的数据,做出结论(可以将部分测试结果进行截屏)。6小结:对本次实验的心得体会,所遇到的问题及解决方法,其他思考和建议。7指导教师评语及成绩:指导教师依据学生的实际报告内容,用简练语言给出本次实验报告的评价和价值。