文章目录

  • 17.聚类方法
  • 1.系统聚类
  • 2.类数选择
  • 3.动态聚类
  • 4.最优分割法(Fisher算法)
  • 回顾总结


17.聚类方法

1.系统聚类

系统聚类是一种聚类的方法,它的主要思想是,开始时每个对象自成一类,然后每次将最相似的两个类合并,从而让类别总数减少1。从它的方法上,我们可以看出,系统聚类的过程涵盖了类别数Java做聚类分析_CL至样本容量Java做聚类分析_Java做聚类分析_02的所有情况,也就是说,想要分成几类,都可以在系统聚类的过程中得以实现,不过有的划分是有效的,有的划分则显得很勉强。

从系统聚类的步骤中,可以看见系统聚类法的一些特点。系统聚类的步骤是这样的:

  1. 数据预处理。一般是提取数据矩阵并进行标准化(或者其他数据变换),然后选择合适的距离度量。
  2. 初始情况下每个样品自成一类,计算Java做聚类分析_CL_03个类两两间的距离。
  3. 将距离最近的类进行合并,此时类数为Java做聚类分析_Java做聚类分析_04,得到的新类为Java做聚类分析_聚类算法_05
  4. 重复执行2~3步,直到Java做聚类分析_Java做聚类分析_06为止,这样就可以得到Java做聚类分析_Java做聚类分析_07
  5. 画出谱系聚类图。谱系聚类图是一个树状图,具体形态如下(高度是某种距离度量)。

Java做聚类分析_聚类算法_08

  1. 决定分类的个数,由聚类过程可以直接根据类数得到聚类结果。

在系统聚类的过程中,我们能够决定的部分,是度量的选择方式,以及最后生成类的个数。度量的选择方式可以是上一篇文章中定义的那些,不过由于距离定义方式不同,递推公式也不同,现有一种统一的递推距离定义式:
Java做聚类分析_CL_09
随着聚类方式的不同,参数Java做聚类分析_CL_10的定义方式也不同,下表是不同方法的参数取值,Euclidean代表必须选择欧氏距离。

方法

Java做聚类分析_CL_10

single

1/2

1/2

0

-1/2

complete

1/2

1/2

0

1/2

median

1/2

1/2

一般取-1/4

0

centroid (Euclidean)

0

average

0

0

mcquitty

0

ward (Euclidean)

Java做聚类分析_聚类_25

0

2.类数选择

由于系统聚类法最终给出的是结果是谱系聚类图,任给一个类的个数,都能够得到相应的聚类结果,因此,类数必须由人为确定。直观地,我们可以从谱系聚类图上画出一条阈值线,将低于这条线的聚类情况当作聚类结果,并由此决定类数;也可以绘制数据点的二维、三维散点图(高维的可以嵌入二维或三维),从图上直观地得到聚类结果。

还可以根据以下的统计量,来确定类的个数。

  1. Java做聚类分析_聚类_25统计量。参照方差分析的部分,定义为
    Java做聚类分析_聚类算法_27
    这里
    Java做聚类分析_ide_28
    也就是组内离差平方和与总离差平方和的比值。如果Java做聚类分析_Java做聚类分析_29随着Java做聚类分析_Java做聚类分析_30的增加变化不大,则不需要继续划分类。
  2. 半偏Java做聚类分析_CL_31统计量。定义为
    Java做聚类分析_CL_32
  3. Java做聚类分析_聚类_33统计量。定义为
    Java做聚类分析_CL_34
    如果伪Java做聚类分析_聚类算法_35越大,则分为Java做聚类分析_Java做聚类分析_30个类的效果越显著。但是Java做聚类分析_聚类算法_35并不具有Java做聚类分析_聚类_33分布的特点。

3.动态聚类

动态聚类的思想是,开始时粗略地分类,然后按照某种最优的原则修改不合理的分类,直至分类比较合理为止,形成最终的分类结果。有一种动态聚类的步骤如下:

  1. 选择凝聚点(初始类中心)与距离定义。
  2. 确定初始分类,可以按照距离判别归类。
  3. 计算每类重心,将重心作为新的凝聚点。
  4. 重复2~3步骤,直到所有新凝聚点与老的凝聚点重合。

这种方法叫做按批修改法,最终会收敛于凝聚点,其修改原则是使得分类函数(组内平方和)逐渐减小,直至不能再减小为止。

另一种方法叫逐个修改法,也叫K均值方法,它的步骤如下:

  1. 人为选定三个数,类数Java做聚类分析_CL_39,类间距离最小值Java做聚类分析_聚类_40与类内距离最大值Java做聚类分析_ide_41
  2. 取前Java做聚类分析_CL_39个样品作为凝聚点,计算Java做聚类分析_CL_39个凝聚点两两间的距离,如果最小距离Java做聚类分析_Java做聚类分析_44,就合并这两个凝聚点,并使用这两个点的重心作为凝聚点,重复此步骤直到所有凝聚点之间的距离Java做聚类分析_CL_45
  3. 将剩下的Java做聚类分析_聚类_46个样品逐个归类。对于每一个样品,如果该样品与所有凝聚点之间的距离都Java做聚类分析_聚类算法_47,就将其作为新的凝聚点;否则将其归入距离最近的凝聚点所在的类,随即重新计算这一类的重心作为新凝聚点。如果此时凝聚点之间的距离都Java做聚类分析_CL_45,就考虑下一个样品,否则重复步骤2。
  4. 将全部样品按照步骤3进行归类,如果某个样品归类后分类与原来一致,则重心不必计算;否则重新计算所涉及到的两类重心(原先分的类与新分的类)。

4.最优分割法(Fisher算法)

最优分割法的应用情况是,给定的样本是有序的,这个顺序不能随意打乱,此时的聚类相当于往给定样本中设置分割(插入挡板),从而将样本分为几类。由于样本的顺序固定,所以此时要讨论的情况比无序情况要少得多。

这种情况下,Fisher算法可以保证获得最优解,接下来简要介绍一下Fisher算法。

  1. 定义类直径。对于类Java做聚类分析_Java做聚类分析_49,定义类均值为Java做聚类分析_聚类_50。直径的定义为
    Java做聚类分析_Java做聚类分析_51
  2. 定义分类的损失函数。令Java做聚类分析_Java做聚类分析_52代表把Java做聚类分析_CL_03个有序样品分为Java做聚类分析_Java做聚类分析_30类的某种分法,假设分点为Java做聚类分析_ide_55,它们是每一类的第一个下标,则分类的损失函数记作
    Java做聚类分析_CL_56
    也就是每一类的直径加总,最优解的判定就是使得Java做聚类分析_Java做聚类分析_57最小的一种分类方法,记作Java做聚类分析_聚类_58
  3. 求最优解。Fisher算法是一种动态规划,其核心过程是以下两个递推公式:
    Java做聚类分析_Java做聚类分析_59

回顾总结

  1. 系统聚类是一种静态聚类的方法,它的主要思想是一开始每一个样品自成一类,然后每次比较两个类之间的距离,将距离最小的两类进行合并并重复此流程。
  2. 动态聚类的思想是,通过初始设定的分类数与初始点,进行动态调整,最后返回一个收敛的聚类结果。
    态聚类的方法,它的主要思想是一开始每一个样品自成一类,然后每次比较两个类之间的距离,将距离最小的两类进行合并并重复此流程。
  3. 动态聚类的思想是,通过初始设定的分类数与初始点,进行动态调整,最后返回一个收敛的聚类结果。
  4. 最优分割是一种动态规划的聚类方式,它将有序样品划分为组内离差和最小的类。