聚类算法:原理、应用与对比
聚类算法在自然语言处理(NLP)等众多领域中扮演着重要角色,它能够将一组对象划分为不同的组或簇。下面我们将深入探讨聚类算法的相关内容。
聚类基础概念
聚类算法的核心目标是把相似的对象放在同一组,将不相似的对象分到不同组。以布朗语料库中22个高频词的聚类为例,通过树状图(dendrogram)可以直观地看到聚类结果。树状图是一种分支图,底部节点之间的明显相似度通过连接它们的线条高度来表示。每个节点代表一个通过合并两个子节点形成的簇。例如,“in”和“on”形成一个簇,“with”和“for”也形成一个簇,然后这两个子簇又合并成一个包含四个对象的簇。节点的“高度”对应着被合并的两个簇之间相似度的降低,也就是合并执行的顺序。在这个例子中,“in”和“on”之间的相似度最大,对应树状图中最低的水平线;“be”和包含其他21个词的簇之间的相似度最小,对应最高的水平线。
在聚类中,虽然对象作为标记都是不同的,但通常会使用一组特征和值(即数据模型)来描述和聚类对象,多个对象在这个模型中可能具有相同的表示。因此,我们定义聚类算法在“包”(bags)上工作,“包”类似于集合,但允许有多个相同的项。
那么,这里所说的词之间的“相似度”是如何定义的呢?首先,统计了布朗语料库中每个词的标记的左右邻词的分布。这种分布相当真实地体现了Firth的观点,即可以通过一个词周围出现的词来对其进行分类。这里不再像某些情况那样寻找独特的搭配,而是捕捉和利用词的整个分布模式。词的相似度通过两个词的邻词分布的重叠程度来衡量。例如,“in”和“on”的相似度很大,因为它们的左右邻词相似(都是介词,且后面往往跟着冠词或其他构成名词短语的词);“is”和“he”的相似度较小,因为它们的语法功能不同,直接邻词的重叠较少。
聚类的初始状态是每个词形成自己的簇,然后在每一步中,将最接近的两个簇合并成一个新的簇。
聚类在统计NLP中的主要用途
聚类在统计NLP中有两个主要用途:探索性数据分析和泛化。
探索性数据分析
探索性数据分析是处理定量数据时的重要活动。当我们面对新问题,想要开发概率模型或了解现象的基本特征时,这是第一步。在统计NLP中,聚类是一种特别重要的探索性数据分析技术,因为语言对象通常没有直接的可视化表示。而其他领域,如处理数值或地理数据的领域,往往有明显的可视化方式,如流行病学中某种疾病发病率的地图。聚类可以产生更丰富的层次结构,并且在处理复杂的可视化显示时可能更方便。例如,对于不了解英语的人来说,从上述的树状图中可以大致将词分为不同的词性,这有助于后续的分析。同时,我们也可以利用这个树状图来评估邻词重叠作为词性相似度度量的有效性。聚类能够揭示基于邻词表示的优点和缺点,它对介词的聚类效果很好(所有介词都被归为一组),但对于像“this”等词,与语法上相似的词没有被归为一组,说明这种表示方式存在一定的局限性。
泛化
聚类在NLP中的另一个主要用途是泛化。例如,在将法语文本翻译成英语时,要确定与名词“Friday”搭配的正确介词。假设我们有一个英语训练文本,其中包含“on Sunday”、“on Monday”和“on Thursday”,但没有“on Friday”。通过将英语名词聚类到具有相似句法和语义环境的组中,一周中的日子会被归为同一簇,因为它们共享一些环境,如“until day - of - the - week”、“day - of - the - week”和“day - of - the - week morning”。基于同一簇中的成员具有相同适用环境的假设,我们可以从“on Sunday”、“on Monday”和“on Thursday”推断出“on Friday”的正确性。所以,聚类是一种学习方式,我们将对象分组到簇中,并将对某些簇成员的了解(如介词“on”的适用性)推广到其他成员。
聚类与分类的区别
另一种将对象分组的方式是分类,但分类是有监督的,需要为每个组提供一组带标签的训练实例。而聚类不需要训练数据,因此被称为无监督的,因为没有“教师”提供带有类别标签的训练集。聚类的结果仅取决于数据中的自然划分,例如上述树状图中介词、冠词和代词的不同邻词,而不依赖于任何预先存在的分类方案。虽然聚类有时被称为自动或无监督分类,但为避免混淆,我们不使用这些术语。
聚类算法的类型
聚类算法有多种类型,主要可以分为层次聚类和非层次(扁平)聚类,以及硬聚类和软聚类。
层次聚类与非层次聚类
- 层次聚类 :可以通过自底向上或自顶向下的方式生成聚类树。自底向上的算法(也称为凝聚聚类)是一种贪心算法,从每个对象单独形成一个簇开始,每一步确定最相似的两个簇并将它们合并,直到形成一个包含所有对象的大簇。自顶向下的算法(也称为分裂聚类)同样是贪心算法,从包含所有对象的一个簇开始,每次迭代确定最不连贯的簇并将其分裂。层次聚类要求相似度函数是单调的,即合并操作不会增加相似度,否则层次结构将无法解释。
- 非层次聚类 :通常由一定数量的簇组成,簇之间的关系往往不确定。大多数产生扁平聚类的算法是迭代的,从一组初始簇开始,通过迭代重新分配操作来改进簇。
硬聚类与软聚类
- 硬聚类 :每个对象被分配到且仅分配到一个簇。
- 软聚类 :允许对象有不同程度的成员资格,并且可以属于多个簇。在概率框架中,一个对象在簇上有一个概率分布;在向量空间模型中,对象在多个簇中的成员程度可以形式化为向量与每个簇中心的相似度。簇的中心(也称为质心或重心)是簇中所有点的向量各分量的平均值。在层次聚类中,分配通常是硬的;在非层次聚类中,两种分配方式都很常见。大多数软分配模型假设一个对象只分配到一个簇,但与硬聚类的区别在于不确定哪个簇是正确的。还有真正的多分配模型,即析取聚类模型,其中一个对象可以真正属于多个簇。例如,在词聚类中,“book”可能同时完全属于语义上的“对象”类别和句法上的“名词”类别。
不同聚类算法的特点对比
不同的聚类算法具有不同的特点,以下是层次聚类和非层次聚类的一些特点对比:
| 聚类类型 | 优点 | 缺点 |
| — | — | — |
| 层次聚类 | 适合详细的数据分析,能提供比扁平聚类更多的信息 | 没有单一的最佳算法,效率低于扁平聚类(对于n个对象,至少要计算一个n x n的相似度系数矩阵,并在过程中更新) |
| 非层次聚类 | 如果考虑效率或数据集非常大时更合适,K - means概念简单,结果通常足够 | K - means假设简单的欧几里得表示空间,不能用于许多数据集(如颜色等名义数据),在这种情况下,EM算法是首选,但它需要基于复杂的概率模型来定义簇和分配对象 |
层次聚类的具体算法
层次聚类的树可以通过自底向上或自顶向下的方式生成。
自底向上(凝聚)聚类
自底向上的算法,即凝聚聚类,是一种贪心算法。以下是其具体步骤:
给定:
1. 一组对象X = {x1, x2, ..., xn}
2. 一个相似度函数sim: X x X -> R
步骤:
1. 初始化每个对象为一个单独的簇,即C := {{x1}, {x2}, ..., {xn}}
2. 当C中簇的数量大于1时:
3. 找到C中相似度最大的两个簇Ci和Cj
4. 将Ci和Cj合并成一个新的簇Ck = Ci U Cj
5. 从C中移除Ci和Cj,加入Ck
3. 结束,此时C中只剩下一个包含所有对象的簇
这里需要注意的是,我们用簇之间的相似度来描述聚类算法,所以合并相似度最大的簇。但有时人们用簇之间的距离来思考,此时会合并距离最小的簇,容易在取最大值还是最小值上产生混淆。不过,可以很容易地从距离度量d得到相似度度量,例如通过sim = 1 / (1 + d)。
自顶向下(分裂)聚类
自顶向下的算法,即分裂聚类,同样是贪心算法。其步骤如下:
给定:
1. 一组对象X = {x1, x2, ..., xn}
2. 一个相似度函数sim: X x X -> R
3. 一个分裂函数split: P(X) -> P(X) x P(X)
步骤:
1. 初始化一个包含所有对象的簇C := {X}
2. 当C中簇的数量大于1时:
3. 找到C中最不连贯的簇Ci
4. 使用分裂函数将Ci分裂成两个子簇Cj和Ck
5. 从C中移除Ci,加入Cj和Ck
3. 结束
层次聚类只有在相似度函数是单调的情况下才有意义,即合并操作不会增加相似度。否则,树中的“接近度”将不再对应概念上的相似度。
单链接和完全链接聚类
在层次聚类中,常用的相似度函数有单链接、完全链接和组平均三种,具体定义如下表所示:
| 函数 | 定义 |
| — | — |
| 单链接 | 两个簇中最相似的两个成员的相似度 |
| 完全链接 | 两个簇中最不相似的两个成员的相似度 |
| 组平均 | 成员之间的平均相似度 |
单链接聚类
单链接聚类中,两个簇之间的相似度是簇中最接近的两个对象的相似度。单链接聚类的簇具有良好的局部连贯性,因为相似度函数是局部定义的。但簇可能会变得细长或“散乱”,这种产生细长簇的趋势有时被称为“连锁效应”,因为它只关注一系列大的相似度,而不考虑全局上下文。单链接聚类与最小生成树(MST)密切相关,单链接层次结构可以通过从MST中移除最长的边,将其分成两个不相连的部分来得到,然后对这两个子部分递归地应用相同的操作。
以下是一个简单的示例来说明单链接聚类的过程:
假设有一组平面上的点,如图14.4所示。首先,最相似的点对是a/b、c/d、e/f和g/h,将它们分别合并成簇,得到图14.5的中间聚类结果。然后,b/c和e/f比其他不在同一簇中的点对更接近,将它们对应的簇合并,最终得到图14.6的单链接聚类结果。可以看到,虽然局部上相邻的点在同一簇中,但从全局来看,簇的质量可能不佳,例如a与e比与d更接近,但a和d在同一簇,而a和e不在同一簇。
完全链接聚类
完全链接聚类的相似度函数关注全局簇质量。两个簇的相似度是它们最不相似的两个成员的相似度,因此可以避免产生细长的簇。例如,在图14.5的中间聚类结果中,完全链接聚类会先合并两个左簇,再合并两个右簇,得到图14.7的结果。这里,左簇中最不相似的点对(如a/f或b/e)的相似度比两个上簇中最不相似的点对(如a/d)的相似度大。
通常我们认为“紧凑”的簇比“散乱”的簇更好,这反映了一种直觉,即簇是围绕一个中心点的一组对象,类似于高斯分布产生的球形簇。但这只是对好簇的一种可能的潜在模型,实际上,好簇的定义取决于我们对数据的先验知识和模型。例如,夏威夷群岛是由沿着直线移动的火山过程形成的,新火山以大致规则的间隔出现。在这种情况下,单链接是一种非常合适的聚类模型,因为局部连贯性是关键,我们期望得到细长的簇。
在大多数NLP应用中,完全链接聚类产生的球形簇比单链接聚类的细长簇更可取。但完全链接聚类的时间复杂度为O(n^2),因为有n - 1个合并步骤,每个步骤需要O(n^2)次比较来找到每个簇对中任意两个对象之间的最小相似度(其中n是要聚类的对象数量)。相比之下,单链接聚类的复杂度为O(n^2),但在计算出所有对象的n x n相似度矩阵后,每次合并后可以在O(n)时间内更新矩阵。如果簇Ci和Cj合并成Ck = Ci U Cj,那么Ck与另一个簇Cl的相似度就是Ci和Cj分别与Cl相似度的最大值。每个n - 1次合并最多需要O(n)次常数时间的更新,因此合并和相似度计算的复杂度都是O(n^2)。
综上所述,不同的聚类算法会产生不同的结果,这些结果包含了不同算法的一些特定偏差。在实际应用中,需要根据数据的特点和具体需求选择合适的聚类算法。
聚类算法:原理、应用与对比
常用相似度函数在聚类中的应用及特点
在聚类过程中,相似度函数起着关键作用,它决定了如何衡量对象之间的相似程度,进而影响聚类的结果。除了前面提到的单链接、完全链接和组平均相似度函数,不同的相似度函数适用于不同的场景和数据特点。
- 单链接相似度函数 :单链接聚类通过寻找两个簇中最相似的两个成员的相似度来确定簇间相似度。这种方式使得聚类具有良好的局部连贯性,因为它只关注局部的相似关系。然而,它容易产生细长或“散乱”的簇,出现“连锁效应”。例如在处理一些具有线性分布的数据时,单链接聚类可能会将沿着一条线分布的对象连接成一个细长的簇,而忽略了数据的整体结构。在实际应用中,如果数据具有局部紧密相连的特点,单链接聚类可以很好地捕捉到这些局部关系,但对于需要考虑全局结构的情况,可能就不太适用。
- 完全链接相似度函数 :完全链接聚类则关注两个簇中最不相似的两个成员的相似度。这种方法能够避免产生细长的簇,更倾向于形成紧凑、球形的簇。在大多数情况下,当我们期望聚类结果具有较好的全局结构和紧凑性时,完全链接聚类是一个不错的选择。但它的时间复杂度较高,对于大规模数据集,计算成本会显著增加。
- 组平均相似度函数 :组平均相似度函数计算成员之间的平均相似度。它综合考虑了簇内所有成员之间的关系,既不像单链接那样只关注局部最相似的成员,也不像完全链接那样只考虑最不相似的成员。组平均相似度函数在一定程度上平衡了局部和全局的信息,对于一些数据分布较为均匀的情况,能够得到较为合理的聚类结果。
聚类算法的复杂度分析
聚类算法的复杂度是选择合适算法的重要考虑因素之一,尤其是在处理大规模数据集时。不同类型的聚类算法在时间和空间复杂度上有很大差异。
- 层次聚类的复杂度 :层次聚类无论是自底向上的凝聚聚类还是自顶向下的分裂聚类,都需要进行大量的相似度计算和簇的合并或分裂操作。对于凝聚聚类,需要计算一个n x n的相似度系数矩阵,并且在合并过程中不断更新这个矩阵。对于n个对象,至少需要进行O(n^2)的计算量。完全链接聚类的时间复杂度为O(n^2),因为每个合并步骤都需要比较所有对象对的相似度。单链接聚类虽然在计算出相似度矩阵后可以在O(n)时间内更新矩阵,但总体复杂度仍然是O(n^2)。因此,层次聚类在处理大规模数据集时效率较低。
- 非层次聚类的复杂度 :非层次聚类中的K - means算法概念简单,通常具有较好的效率。它的时间复杂度主要取决于迭代次数和数据维度,一般为O(knm),其中k是簇的数量,n是数据点的数量,m是数据的维度。然而,K - means假设数据具有简单的欧几里得表示空间,对于一些复杂的数据分布,如非球形分布或具有不同密度的数据,可能无法得到理想的聚类结果。EM算法可以处理更复杂的概率模型,但它的计算复杂度也相对较高,需要根据具体的模型和数据进行评估。
聚类算法在不同领域的应用案例
聚类算法在多个领域都有广泛的应用,下面介绍一些具体的应用案例。
- 自然语言处理(NLP) :在NLP中,聚类可以用于词的分类、文本分类、信息检索等任务。例如,通过对词进行聚类,可以将具有相似语义或语法功能的词归为一类,有助于提高语言模型的性能。在文本分类中,聚类可以帮助发现文本的主题结构,将相似的文本聚集在一起。在信息检索中,聚类可以对检索结果进行分组,使用户更方便地浏览和筛选信息。
- 图像识别 :在图像识别领域,聚类可以用于图像分割、特征提取等任务。例如,将图像中的像素点根据颜色、纹理等特征进行聚类,将相似的像素点归为同一类,从而实现图像的分割。聚类还可以用于提取图像的特征,将图像中的不同区域或对象进行分类,为后续的图像识别和分析提供基础。
- 生物信息学 :在生物信息学中,聚类可以用于基因表达数据分析、蛋白质结构分类等任务。通过对基因表达数据进行聚类,可以发现具有相似表达模式的基因,从而推测它们在生物过程中的功能。在蛋白质结构分类中,聚类可以将具有相似结构的蛋白质归为一类,有助于研究蛋白质的功能和进化关系。
聚类算法的选择策略
在实际应用中,选择合适的聚类算法需要综合考虑多个因素。以下是一些选择聚类算法的策略。
- 数据特点 :首先要考虑数据的特点,包括数据的维度、分布、规模等。如果数据具有明显的层次结构,层次聚类可能是一个好的选择;如果数据规模较大,需要考虑算法的效率,非层次聚类中的K - means或EM算法可能更合适。如果数据具有复杂的分布,如非球形分布或具有不同密度,可能需要选择能够处理这些复杂情况的算法,如基于密度的聚类算法。
- 聚类目标 :明确聚类的目标也很重要。如果需要详细的数据分析,了解数据的层次结构,层次聚类可以提供更丰富的信息;如果只是为了快速将数据分组,得到大致的聚类结果,非层次聚类可能更高效。如果需要处理具有模糊性或多标签的数据,软聚类算法可能更适合。
- 计算资源 :计算资源也是一个重要的考虑因素。如果计算资源有限,需要选择复杂度较低的算法。例如,K - means算法相对简单,计算成本较低,适合在资源受限的环境中使用;而一些复杂的算法,如基于模型的聚类算法,可能需要更多的计算资源和时间。
聚类算法的未来发展趋势
随着数据量的不断增加和应用场景的不断拓展,聚类算法也在不断发展和创新。以下是一些聚类算法的未来发展趋势。
- 结合多种算法 :单一的聚类算法往往有其局限性,未来可能会更多地将多种算法结合起来,发挥各自的优势。例如,将层次聚类和非层次聚类结合,先使用层次聚类得到数据的大致层次结构,再使用非层次聚类进行细化和优化。
- 处理复杂数据类型 :随着数据类型的不断丰富,如高维数据、流数据、图数据等,聚类算法需要能够处理这些复杂的数据类型。例如,针对高维数据,需要开发能够有效降低维度并进行聚类的算法;对于流数据,需要设计能够实时更新聚类结果的算法。
- 融入深度学习 :深度学习在许多领域取得了巨大的成功,未来聚类算法可能会与深度学习相结合。例如,利用深度学习模型提取数据的特征,然后使用聚类算法对这些特征进行聚类,以提高聚类的准确性和性能。
总结
聚类算法是一种强大的数据分析工具,在自然语言处理、图像识别、生物信息学等多个领域都有广泛的应用。不同的聚类算法具有不同的特点和适用场景,包括层次聚类和非层次聚类、硬聚类和软聚类等。在选择聚类算法时,需要综合考虑数据特点、聚类目标和计算资源等因素。未来,聚类算法将不断发展和创新,结合多种算法、处理复杂数据类型和融入深度学习将是其重要的发展趋势。通过合理选择和应用聚类算法,我们可以更好地理解和分析数据,发现数据中的潜在模式和结构,为各个领域的决策和研究提供有力支持。
以下是一个简单的mermaid流程图,展示了选择聚类算法的基本流程:
graph TD;
A[开始] --> B{数据特点};
B -->|高维数据| C[考虑降维后聚类];
B -->|大规模数据| D[选择高效算法如K - means];
B -->|有层次结构| E[层次聚类];
B -->|复杂分布| F[基于密度或模型的聚类];
C --> G{聚类目标};
D --> G;
E --> G;
F --> G;
G -->|详细分析| H[层次聚类];
G -->|快速分组| I[非层次聚类];
G -->|处理模糊数据| J[软聚类];
H --> K{计算资源};
I --> K;
J --> K;
K -->|资源有限| L[选择简单算法];
K -->|资源充足| M[选择复杂算法];
L --> N[结束];
M --> N;
通过以上的介绍和分析,希望读者对聚类算法有更深入的了解,能够根据实际需求选择合适的聚类算法,并在实际应用中取得良好的效果。
超级会员免费看
863

被折叠的 条评论
为什么被折叠?



