一、实验目的
本次实验的主要目的为,通过实验课上具体例子进行代码编写,掌握聚类分析算法的原理与基本思想,能够熟练地在Visual Stduio C#环境下,完成聚类分析的全部流程,包括数据标准化、绝对值距离计算、聚类操作等等,以提高自我对聚类分析算法的理解,加深对算法设计及程序编制的认识和掌握。
二、实验内容
1.数据极差标准化
2.绝对值距离计算
3.类之间的距离计算
4.聚类分析
三、实验过程
(一)数据极差标准化
数据极差标准化的代码如下图所示,实现极差标准化我们的方法为:首先通过遍历获得每一列中的最大值与最小值,接着,再次遍历数据矩阵的每一个元素,对每个元素进行极差标准化操作,即:对于矩阵中的每个元素 data[i, j],通过减去该列的最小值,然后除以该列的极差,即可得到数据标准化后的结果:
(二)绝对值距离计算
在上述步骤中得到数据标准化的结果后,各个数据便成为可以互相比较的存在了,我们即可开始计算数据集中任意两个数据间的距离,在如下所示的代码中,我们主要利用到的是C#中的Math.Abs()方法用以获取绝对值:
(三)类之间距离计算
在本程序中我们选择使用的是最短距离法来实现计算两个类之间的距离,具体代码如下图所示,首先第一个函数DisBtwTwoGroups()用于计算两个类之间的距离,具体原理为:遍历两个类中的所有数据点,然后计算每对数据点之间的距离,选择其中的最小值作为我们两个类之间的距离:
第二个函数CalDisMatrix()用于生成类与类之间的距离矩阵,其实现思想为:通过遍历所有的类组合,调用 DisBtwTwoGroups() 函数计算两个类之间的距离,并将结果填入距离矩阵中相应的位置,即可生成我们希望得到的距离矩阵:
(四)聚类分析
1.初始化每个对象为单独聚类:以上我们的准备工作就已经基本结束了,接下来我们正式进入此实验中最重要也是我认为最复杂的一个部分聚类分析部分,首先,为了更好地区分类与对象间的关系,我们先将每个对象初始化为单独的聚类如下代码所示:
2.循环合并距离最近的两个聚类:如下代码中,我们首先设定目标聚类数量(在此次实验中为1),并构建一个while循环,只要当前的聚类数量大于目标聚类数量,就继续执行循环,利用之前实验步骤中创建的计算聚类之间的距离矩阵,在每次迭代中找到距离最近的两个聚类并将它们合并,合并后将选中的两个对象从聚类列表中删除,而将新生成的聚类添加到聚类列表的末尾:
3.输出每次循环合并的信息:为达到老师提出的实验效果,我们在while循环的最后补充一个循环用以输出每次聚类合并循环后的状态信息,它将输出每个聚类的编号以及其中包含的对象代码如下图所示:
四、实验结果
最后我们运行代码得到实验结果如下图所示,可以看到虽然类的顺序与老师结果有所不同(主要原因在于我们在添加新生成聚类时,使用的方法是:从聚类列表中删除选择聚类,将新生成聚类添加至最后),但每次聚类选择的对象结果完全符合,因此判断我们实验成功:
五、实验心得
在此次实验中我们结合具体例子深入学习了解了最短距离聚类法算法的基本原理与具体实现步骤,通过实验课上C#环境下代码的编写与理论课学习的内容相结合,我对方法的封装、C#编程语言的编写等都有了更为深入的认识,其中我认为收获最深也是最难的部分还是对聚类分析的核心思想的理解:在一个for循环中,我们不断地寻找最近聚类、合并聚类、更新聚类间的距离矩阵,并输出每次合并后的聚类结果,这就要求我们在编写代码中要有清晰的逻辑思维,时刻明白我们正在做什么,因此我将最后一个函数GroupDone的编写思路汇总如下: