目录

第 1 章 聚类的奥秘:为何与何为

第 2 章 原型聚类:概念与核心原理

2.1 原型的定义

2.2 原型聚类工作流程

第 3 章 常见原型聚类算法剖析

3.1 K-Means 算法

3.1.1 算法步骤

3.1.2 优缺点分析

3.2 学习向量量化(LVQ)

3.2.1 算法原理

3.2.2 应用场景

3.3 高斯混合聚类

3.3.1 概率模型基础

3.3.2 优势与适用范围

第 4 章 Python 实战:原型聚类算法实现

4.1 准备工作:环境搭建与数据准备

4.2 K-Means 算法实现

4.3 LVQ 算法实现

4.4 高斯混合聚类实现

第 5 章 总结与展望


第 1 章 聚类的奥秘:为何与何为

在机器学习的广阔领域中,聚类作为一种无监督学习技术,占据着举足轻重的地位。它就像是一位数据探险家,深入到无标签数据的神秘世界,挖掘其中隐藏的内在结构和规律。

想象一下,你拥有海量的客户数据,这些数据没有任何预先定义的类别标签,但你希望了解客户的群体特征,以便进行精准营销和产品优化。这时,聚类算法就能大显身手,它可以根据客户数据的特征,将相似的客户自动划分到同一组,从而发现不同客户群体的行为模式和偏好。

聚类的核心目标是将数据集中的样本划分为若干个不相交的子集,每个子集被称为一个簇。同一簇中的样本尽可能相似,不同簇中的样本尽可能不同。这种相似性或差异性通常通过某种距离度量来衡量,如欧氏距离、曼哈顿距离等。通过聚类,我们可以在没有先验知识的情况下,发现数据中的自然分组,为后续的数据分析和决策提供有力支持。

在实际应用中,聚类有着广泛的用途。在市场分析中,它可以帮助企业进行客户细分,针对不同的客户群体制定个性化的营销策略;在图像识别领域,聚类可用于图像分割,将图像中的不同物体或区域区分开来;在生物信息学中,聚类能够对基因数据进行分析,找出具有相似功能的基因簇。

而原型聚类作为聚类算法家族中的重要成员,以其独特的方式从无标签数据中发现结构。它通过寻找数据集中的原型(代表性样本或中心点)来定义簇,每个簇由一个或多个原型来描述。这些原型就像是各个簇的 “代言人”,它们的位置和特征决定了簇的形状和范围。在后续的章节中,我们将深入探讨原型聚类的原理、常见算法及其实现,一起揭开它神秘的面纱。

第 2 章 原型聚类:概念与核心原理

2.1 原型的定义

在原型聚类的领域中,原型是一个极为关键的概念,它如同照亮聚类分析之路的灯塔,为我们理解数据的内在结构提供了核心线索。简单来说,原型是样本空间中的一个代表性点,其使命是精准地描述某个簇的核心特征。

从直观角度理解,我们可以将原型视为簇的 “灵魂” 所在。以 K-Means 算法为例,这是一种广为人知的原型聚类算法,其中的原型就是簇的质心。质心的计算方式是该簇内所有样本点的均值,它代表了簇内数据点在各个维度上的平均位置。假设有一个包含多个数据点的簇,这些数据点在二维平面上分布,通过计算所有点在 x 轴和 y 轴坐标的平均值,我们就能得到这个簇的质心,也就是原型。这个质心处于簇的相对中心位置,周围的数据点围绕它分布,并且与质心的距离相对较近,这体现了同一簇中数据点的相似性。

再比如,在一个客户行为分析的数据集中,我们可能会根据客户的购买频率、购买金额等多个属性进行聚类。某个簇的原型就可以是具有该簇典型购买行为特征的一个 “虚拟客户”,这个 “虚拟客户” 的各项属性值是该簇内所有真实客户对应属性的平均值。通过这个原型,我们可以快速了解该簇客户的整体购买行为模式,如平均购买频率是每周几次,平均购买金额处于哪个区间等。

原型的存在使得我们能够用一个简洁而有代表性的点来概括整个簇的特征,大大简化了对复杂数据分布的理解和分析。它不仅是聚类过程中的关键要素,也是后续对聚类结果进行解释和应用的重要依据。

2.2 原型聚类工作流程

原型聚类的工作流程是一个有条不紊、环环相扣的过程,主要包含初始化原型、分配数据点、更新原型以及重复迭代这几个关键步骤,下面我们将详细阐述每个步骤。

  1. 初始化原型:这是原型聚类的起始点,就如同建造高楼时打下的基石,虽然看似简单,却对后续的聚类结果有着深远的影响。在这一步骤中,我们需要从数据集中选择若干个点作为初始原型。一种常见的方法是随机选择,即从数据集中随机抽取指定数量的样本点作为初始原型。例如,在 K-Means 算法中,如果我们希望将数据集划分为 K 个簇,那么就随机从数据集中选取 K 个点作为初始的簇中心(原型)。这种随机选择的方式简单直接,但也存在一定的局限性,因为初始原型的随机性可能导致最终聚类结果的不稳定性,不同的初始选择可能会得到差异较大的聚类结果。为了改善这一问题,也有一些其他的初始化方法,如 K-Means++ 算法,它通过智能地选择初始原型,使得初始原型之间的距离尽可能远,从而提高聚类结果的稳定性和质量。
  1. 分配数据点:一旦初始原型确定下来,接下来就要将数据集中的每个数据点分配到与其最为相似的原型所对应的簇中。而判断相似性的依据通常是某种距离度量,如欧氏距离、曼哈顿距离等。以欧氏距离为例,它计算的是两个数据点在多维空间中的直线距离。对于数据集中的每一个数据点,我们都计算它与所有原型之间的欧氏距离,然后将该数据点分配到距离最近的原型所代表的簇中。假设我们有一个二维数据集,其中包含多个数据点,以及已经确定的几个初始原型,对于数据集中的某一个点,我们通过公式计算它到各个原型的欧氏距离,然后将其归入距离最小的那个原型所属的簇。这样,所有的数据点都被分配到了相应的簇中,初步形成了聚类的雏形。
  1. 更新原型:在完成数据点的分配后,我们需要根据当前簇内的数据点来重新计算原型的位置,以使得原型能够更好地代表簇的特征。不同的原型聚类算法在更新原型的方式上会有所不同。在 K-Means 算法中,更新原型的方法是计算簇内所有数据点的均值,将这个均值作为新的原型。例如,对于某个簇,我们将该簇内所有数据点在各个维度上的坐标相加,然后除以数据点的数量,得到的结果就是新的簇中心(原型)。通过这种方式更新原型,能够使原型更加贴近簇内数据点的实际分布,从而提高聚类的准确性。
  1. 重复迭代:更新原型之后,我们需要再次进行数据点的分配和原型的更新,如此反复迭代,直到满足一定的收敛条件。收敛条件可以是多种形式,常见的有原型位置不再显著变化,即相邻两次迭代中,原型的位置移动距离小于某个预设的阈值;或者达到了预先设定的最大迭代次数。在迭代过程中,随着每次数据点的重新分配和原型的更新,聚类结果会逐渐趋于稳定,簇内的数据点越来越相似,簇间的数据点差异越来越明显。当满足收敛条件时,迭代过程停止,我们就得到了最终的聚类结果。

原型聚类的工作流程通过不断地调整原型和分配数据点,逐步挖掘数据集中隐藏的聚类结构,为我们揭示数据的内在规律提供了有力的工具。

第 3 章 常见原型聚类算法剖析

3.1 K-Means 算法

3.1.1 算法步骤

K-Means 算法是原型聚类算法中的经典之作,其算法步骤简洁而高效,犹如一条精密的生产线,有条不紊地对数据进行聚类处理。

  1. 随机选择初始质心:这是 K-Means 算法的起点,就像是在一片未知的土地上随机插上 K 面旗帜,作为各个簇的初始中心。具体来说,我们从数据集中随机挑选 K 个数据点,这些点将作为初始的簇质心。例如,假设有一个包含 1000 个数据点的数据集,我们希望将其分为 5 个簇,那么就会从这 1000 个点中随机选取 5 个点作为初始质心。这种随机选择的方式虽然简单直接,但也存在一定的随机性和不确定性,不同的初始质心选择可能会导致最终聚类结果的差异。
  1. 将数据点分配到最近的质心所在的簇:一旦初始质心确定下来,接下来就要为每个数据点找到它们的 “归属”。我们通过计算每个数据点与所有质心之间的距离(通常使用欧氏距离),将数据点分配到距离最近的质心所对应的簇中。例如,对于数据集中的某一个数据点,我们计算它到 5 个初始质心的欧氏距离,然后将它归入距离最小的那个质心所属的簇。这样,所有的数据点都被分配到了相应的簇中,初步形成了 K 个簇的雏形。
  1. 重新计算每个簇的质心:在完成数据点的分配后,我们需要重新审视每个簇的 “中心”。此时,每个簇的质心将被重新计算,计算方法是该簇内所有数据点的均值。以某个簇为例,我们将该簇内所有数据点在各个维度上的坐标值相加,然后除以数据点的数量,得到的结果就是新的簇质心。通过重新计算质心,使得每个簇的中心能够更好地代表簇内数据点的分布特征。
  1. 重复步骤 2 和 3,直到质心不再变化或达到预设的迭代次数:这一步骤是 K-Means 算法的核心迭代过程,就像一个不断优化的循环,使得聚类结果逐渐趋于稳定。在每次迭代中,我们都会重新分配数据点到最近的质心簇,并重新计算质心。这个过程会一直持续,直到满足一定的停止条件。停止条件通常有两种:一是质心不再发生显著变化,即相邻两次迭代中,质心的位置移动距离小于某个预设的阈值,这表明聚类结果已经趋于稳定;二是达到了预先设定的最大迭代次数,即使质心还在变化,但为了避免算法无限循环,也会停止迭代。

通过以上四个步骤的不断循环和优化,K-Means 算法能够将数据集中的点准确地划分到不同的簇中,从而实现聚类的目的。

3.1.2 优缺点分析

K-Means 算法在聚类领域中应用广泛,这得益于它自身独特的优点,但同时也存在一些不可忽视的缺点。

  1. 优点
    • 算法简单,易于理解和实现:K-Means 算法的原理和步骤非常直观,不需要复杂的数学推导和高深的理论知识,即使是初学者也能轻松理解和掌握。它的实现过程主要涉及到距离计算和均值计算,代码实现相对简洁,这使得它在实际应用中具有很高的可行性和易用性。
    • 对于大数据集,计算效率较高:K-Means 算法的时间复杂度接近线性,为 O (TNk),其中 T 是迭代次数、N 是样本总数、k 为聚类簇数。在处理大规模数据集时,这种高效的计算能力使得它能够快速地完成聚类任务,节省大量的时间和计算资源。例如,在处理包含数百万条数据记录的客户行为数据集时,K-Means 算法能够在较短的时间内给出聚类结果,为企业的数据分析和决策提供及时支持。
    • 结果直观易解释:K-Means 算法最终生成的聚类结果非常直观,每个簇都由一个质心来代表,簇内的数据点围绕质心分布。我们可以通过观察质心的位置和簇内数据点的特征,很容易地理解每个簇所代表的含义和数据的分布规律。例如,在对客户群体进行聚类时,我们可以根据每个簇的质心所代表的客户特征,如年龄、消费金额等,快速了解不同客户群体的特点,从而制定针对性的营销策略。
  1. 缺点
    • 需要预先指定 K 值:K-Means 算法要求用户事先确定要划分的簇的数量 K,然而在实际应用中,准确地确定 K 值往往是非常困难的。如果 K 值设置不当,可能会导致聚类结果不理想。例如,如果 K 值设置过小,一些原本应该属于不同簇的数据点可能会被合并到同一个簇中,从而丢失数据的内在结构;如果 K 值设置过大,可能会将一个原本紧密的簇划分为多个小簇,造成过度聚类的现象。而且,K 值的选择通常需要结合领域知识或通过多次试验来确定,这增加了算法应用的复杂性和不确定性。
    • 对初始值敏感:由于 K-Means 算法是从随机选择的初始质心开始迭代的,不同的初始质心选择可能会导致不同的聚类结果,甚至可能使算法陷入局部最优解。例如,在某些情况下,初始质心的选择可能会使得算法在迭代过程中无法找到全局最优的聚类划分,而是收敛到一个局部较优但并非最佳的结果。为了减少初始值对聚类结果的影响,通常需要多次运行算法,并选择最优的结果,但这也增加了计算成本和时间开销。
    • 难以应对非凸形状分布的数据:K-Means 算法基于欧氏距离来衡量数据点之间的相似度,它假设簇是呈球形或近似球形分布的。因此,当数据的分布呈现出非凸形状,如环形、月牙形等时,K-Means 算法的聚类效果会大打折扣。在这些情况下,K-Means 算法可能会将原本属于同一个非凸簇的数据点划分到不同的簇中,导致聚类错误。
    • 受异常值干扰严重:噪声点和离群点的存在对 K-Means 算法的影响较大。由于 K-Means 算法是通过计算簇内数据点的均值来更新质心的,异常值的存在可能会使质心的位置发生偏移,从而影响整个聚类结果的准确性。例如,在一个包含少量异常值的客户消费数据集中,这些异常值可能会导致某个簇的质心被拉高或拉低,使得该簇的特征不能准确反映大多数正常客户的消费行为。

K-Means 算法虽然具有简单高效等优点,但在应用时需要充分考虑其缺点,并采取相应的措施进行改进和优化,以获得更好的聚类效果。

3.2 学习向量量化(LVQ)

3.2.1 算法原理

学习向量量化(LVQ)算法是一种独特的原型聚类算法,它的诞生受到了神经网络思想的深刻启发,犹如将神经网络的智慧融入到聚类的世界中,开辟了一条新的聚类路径。

LVQ 的核心在于利用一组原型向量来巧妙地代表各个簇,这些原型向量就像是各个簇的 “形象大使”,它们的位置和特征决定了簇的范围和特性。在算法的运行过程中,迭代调整原型向量的位置是关键环节,其目的是让原型向量能够更紧密地靠近属于该簇的数据点,同时远离其他簇的数据点,就像在一场激烈的拔河比赛中,不断调整力量的方向和大小,以达到最理想的平衡状态。

具体来说,LVQ 算法的流程包含以下重要步骤:

  1. 初始化阶段:在这个阶段,我们如同在一片新的土地上播下种子,随机选择若干个初始码本向量,并且为每个向量精心赋予一个类别标签。这些初始码本向量就是原型向量的雏形,它们的初始位置和类别标签虽然是随机确定的,但却为后续的聚类过程奠定了基础。例如,在一个图像识别的应用场景中,我们可能会根据图像的特征维度,随机生成一些初始原型向量,并为它们标记上可能对应的图像类别,如 “猫”“狗”“汽车” 等。
  1. 训练阶段:这是 LVQ 算法的核心阶段,如同一场紧张的训练赛。对于每一个输入样本,算法会迅速计算其与所有码本向量之间的距离,这个距离的计算就像是在衡量样本与各个 “形象大使” 之间的相似度。然后,根据距离的远近,将样本归为距离最近的类别,就像运动员找到了自己所属的队伍。随后,根据 LVQ 独特的更新规则,最近类别对应的码本向量会朝着该样本点移动一定距离,而较远类别对应的码本则保持不变或反方向移动。这个更新过程就像是队伍中的成员根据新加入的队员特点,调整自己的位置和状态,以更好地融合在一起。例如,如果一个新的图像样本被判定为最接近 “猫” 类别的原型向量,那么 “猫” 类别的原型向量就会向这个新样本靠近,以更好地代表 “猫” 这一类图像的特征。
  1. 迭代优化:这个过程就像是一场持续的改进之旅,不断重复上述训练阶段的过程,直到达到预设的停止条件。停止条件可以是达到最大迭代次数,就像运动员完成了规定的训练次数;也可以是误差率低于阈值,意味着聚类的准确性已经达到了预期的标准。在迭代优化的过程中,原型向量会不断地调整和优化,使得聚类的效果越来越好。

通过以上流程,LVQ 算法能够不断地学习和适应数据的分布特征,从而实现准确的聚类和分类。

3.2.2 应用场景

LVQ 算法凭借其独特的算法原理和优势,在许多特定的数据场景中展现出了卓越的性能,为解决实际问题提供了有力的支持。

由于 LVQ 算法在处理数据时,能够有效地学习到数据点之间的相似性和差异性,从而准确地划分簇边界,因此它非常适用于数据点分布较为密集且簇边界较为清晰的场景。在这些场景中,LVQ 算法能够充分发挥其优势,将数据点准确地分类到相应的簇中。

在图像识别领域,LVQ 算法有着广泛的应用。例如,在手写数字识别任务中,我们可以将大量的手写数字图像作为训练样本,通过 LVQ 算法学习到不同数字图像的特征原型向量。这些原型向量就像是不同数字的模板,当有新的手写数字图像输入时,算法可以快速计算该图像与各个原型向量的距离,从而判断出该图像代表的数字。由于手写数字图像的数据点分布相对密集,且不同数字之间的边界较为清晰,LVQ 算法能够很好地适应这种数据特点,实现高精度的识别。

在模式分类方面,LVQ 算法也表现出色。比如在语音识别中,不同的语音模式可以看作是不同的簇,LVQ 算法可以通过对大量语音样本的学习,生成代表不同语音模式的原型向量。当接收到新的语音信号时,算法能够根据这些原型向量准确地判断出语音所属的类别,如识别出是普通话、英语还是其他语言,或者识别出不同的语音指令等。

LVQ 算法在数据点密集、簇边界清晰的场景中具有独特的优势,尤其是在图像识别和模式分类等领域,为相关技术的发展和应用提供了重要的技术支持。

3.3 高斯混合聚类

3.3.1 概率模型基础

高斯混合聚类基于一个巧妙而深刻的假设:数据是由多个高斯分布混合生成的。这一假设就像是为数据的生成过程描绘了一幅多元的画卷,每个高斯分布都代表着一个独特的簇,它们各自拥有不同的均值、协方差矩阵和权重,这些参数共同决定了簇的形状和位置,使得高斯混合聚类能够捕捉到数据分布的复杂性和多样性。

从数学角度来看,对于一个给定的数据集,高斯混合模型可以表示为多个高斯分布的加权和。每个高斯分布都有其对应的概率密度函数,其形式为:

**\( N(x|\mu,\Sigma) = \frac{1}{(2\pi)^{\frac{d}{2}}|\Sigma|^{\frac{1}{2}}} \exp\left(-\frac{1}{2}(x - \mu)^T\Sigma^{-1}(x - \mu)\right) \)

其中,\( x \) 是数据点,\( \mu \) 是均值向量,\( \Sigma \) 是协方差矩阵,\( d \) 是数据的维度,\( |\Sigma| \) 是协方差矩阵的行列式。整个高斯混合模型的概率密度函数则为:

**\( p(x) = \sum_{k=1}^{K} \pi_k N(x|\mu_k,\Sigma_k) \)

这里,\( K \) 是高斯分布的个数,也就是簇的个数;\( \pi_k \) 是第 \( k \) 个高斯分布的权重,且满足 \( \sum_{k=1}^{K} \pi_k = 1 \) ,它表示了第 \( k \) 个簇在数据集中所占的比例。

在实际应用中,我们需要通过数据来估计这些高斯分布的参数。通常采用期望最大化(EM)算法来进行参数估计。EM 算法是一种迭代优化方法,它包含两个主要步骤,即 E 步(期望步)和 M 步(最大化步),通过反复迭代这两个步骤,逐渐逼近最优的参数估计值。

在 E 步中,根据当前的参数估计值,计算每个数据点属于第 \( k \) 个高斯成分的后验概率,也就是责任度 \( \gamma(z_{nk}) \) ,它表示数据点 \( n \) 属于第 \( k \) 个簇的概率:

**\( \gamma(z_{nk}) = \frac{\pi_k N(x_n|\mu_k,\Sigma_k)}{\sum_{j=1}^{K} \pi_j N(x_n|\mu_j,\Sigma_j)} \)

在 M 步中,基于 E 步计算得到的责任度,重新估计模型的参数。例如,对于均值 \( \mu_k \) 的更新公式为:

**\( \mu_k^{new} = \frac{\sum_{n=1}^{N} \gamma(z_{nk}) x_n}{\sum_{n=1}^{N} \gamma(z_{nk})} \)

协方差矩阵 \( \Sigma_k \) 和权重 \( \pi_k \) 也有相应的更新公式。通过不断地迭代 E 步和 M 步,直到似然函数的增幅低于预设的阈值或达到最大迭代次数时,算法停止,此时得到的参数估计值就是我们所期望的结果。

3.3.2 优势与适用范围

高斯混合聚类与一些传统的聚类算法相比,具有显著的优势,这些优势使得它在处理复杂数据分布时表现出色,能够更准确地揭示数据的内在结构。

高斯混合聚类最大的优势在于它能够捕捉到簇的形状和大小的变化,这是许多传统聚类算法所无法比拟的。传统的 K-Means 算法假设簇是呈球形分布的,对于形状不规则的数据往往无法准确聚类。而高斯混合聚类通过多个高斯分布的组合,可以灵活地适应各种不同形状和大小的簇。例如,在一个包含多个不同形状簇的数据集中,有的簇可能是细长的条状,有的簇可能是椭圆形,高斯混合聚类能够根据数据的实际分布情况,调整各个高斯分布的参数,从而准确地识别和划分这些簇。

由于高斯混合聚类基于概率模型,它不仅能够对数据进行硬聚类,即明确地将数据点划分到某个簇中,还能够进行软聚类,即给出每个数据点属于各个簇的概率。这种软聚类的方式在一些需要考虑不确定性的场景中非常有用,例如在医学诊断中,对于一些症状不典型的病例,我们可以通过高斯混合聚类得到每个病例属于不同疾病类别的概率,为医生的诊断提供更丰富的信息。

基于以上优势,高斯混合聚类适用于簇形状不规则或数据分布较为复杂的情况。在金融领域,市场数据的分布往往受到多种因素的影响,呈现出复杂的形态,高斯混合聚类可以帮助分析师对市场数据进行聚类分析,发现潜在的市场模式和规律,为投资决策提供依据。在生物学研究中,基因表达数据、蛋白质结构数据等也常常具有复杂的分布特征,高斯混合聚类能够有效地对这些数据进行分析,挖掘其中隐藏的生物学信息。

高斯混合聚类以其独特的概率模型和强大的适应性,在处理复杂数据分布的聚类问题中发挥着重要作用,为各个领域的数据分析提供了有力的工具。

第 4 章 Python 实战:原型聚类算法实现

4.1 准备工作:环境搭建与数据准备

在开始 Python 实战之前,我们需要搭建好运行环境,并准备好用于聚类的数据集。首先,确保你已经安装了 Python,推荐使用 Python 3.6 及以上版本。然后,安装必要的库:

 

pip install scikit-learn sklvq matplotlib numpy

其中,scikit-learn是 Python 中常用的机器学习库,包含了丰富的聚类算法实现;sklvq用于实现学习向量量化(LVQ)算法;matplotlib用于数据可视化;numpy是 Python 的数值计算核心库,为其他库提供基础支持。

接下来,我们准备一些用于聚类的示例数据。这里,我们使用scikit-learn的make_blobs函数生成一些随机数据点,这些数据点大致分为几个簇,方便我们后续验证聚类算法的效果。代码如下:

 

from sklearn.datasets import make_blobs

# 生成模拟数据,300个样本,4个簇中心,随机种子42保证结果可复现

X, _ = make_blobs(n_samples=300, centers=4, random_state=42)

通过上述代码,我们生成了一个包含 300 个样本的数据集X,这些样本分布在 4 个簇中。

4.2 K-Means 算法实现

使用scikit-learn库实现 K-Means 聚类非常简洁。下面是完整的代码示例:

 

import matplotlib.pyplot as plt

from sklearn.cluster import KMeans

from sklearn.datasets import make_blobs

# 生成模拟数据

X, _ = make_blobs(n_samples=300, centers=4, random_state=42)

# 使用KMeans聚类,设置簇数为4,随机种子42保证结果可复现

kmeans = KMeans(n_clusters=4, random_state=42)

kmeans.fit(X)

# 获取聚类标签和簇中心

labels = kmeans.labels_

centroids = kmeans.cluster_centers_

# 可视化结果

plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')

plt.scatter(centroids[:, 0], centroids[:, 1], s=300, c='red', marker='X')

plt.title('K-Means聚类')

plt.xlabel('特征1')

plt.ylabel('特征2')

plt.show()

在这段代码中:

  1. 首先导入所需的库,包括用于聚类的KMeans,用于生成数据的make_blobs,以及用于可视化的matplotlib.pyplot。
  1. 使用make_blobs生成模拟数据。
  1. 初始化KMeans模型,设置n_clusters为 4,表示我们希望将数据分为 4 个簇,random_state设置为 42,保证每次运行代码时得到相同的聚类结果(方便调试和对比)。
  1. 使用fit方法对数据进行训练,训练完成后,labels属性存储了每个数据点所属的簇标签,cluster_centers_属性存储了每个簇的中心。
  1. 最后,使用matplotlib将数据点和簇中心进行可视化,不同簇的数据点用不同颜色表示,簇中心用红色的X标记。

4.3 LVQ 算法实现

由于scikit-learn没有直接提供 LVQ 的实现,我们使用sklvq库中的广义学习向量量化(GLVQ)算法。以下是实现代码:

 

from sklvq import GLVQ

from sklearn.datasets import make_blobs

import matplotlib.pyplot as plt

# 生成模拟数据,包含样本标签

X, y = make_blobs(n_samples=300, centers=4, random_state=42)

# 使用GLVQ聚类,设置随机种子42

glvq = GLVQ(random_state=42)

glvq.fit(X, y)

# 获取聚类结果和原型向量

labels = glvq.predict(X)

prototypes = glvq.prototypes_

# 可视化结果

plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')

plt.scatter(prototypes[:, 0], prototypes[:, 1], s=300, c='red', marker='X', label='原型向量')

plt.title('广义学习向量量化(GLVQ)')

plt.xlabel('特征1')

plt.ylabel('特征2')

plt.legend()

plt.show()

在这段代码中:

  1. 导入GLVQ用于实现 LVQ 算法,make_blobs用于生成数据,matplotlib.pyplot用于可视化。
  1. 使用make_blobs生成包含样本标签的模拟数据,这是因为 LVQ 是一种有监督的聚类算法,需要样本的类别信息。
  1. 初始化GLVQ模型,并设置random_state为 42。
  1. 使用fit方法对数据进行训练,训练完成后,使用predict方法获取每个数据点的聚类标签,prototypes_属性存储了每个簇的原型向量。
  1. 最后,通过matplotlib将数据点和原型向量进行可视化,不同簇的数据点用不同颜色表示,原型向量用红色的X标记,并添加图例说明。

4.4 高斯混合聚类实现

利用scikit-learn库的GaussianMixture进行高斯混合聚类,代码如下:

 

from sklearn.mixture import GaussianMixture

from sklearn.datasets import make_blobs

import matplotlib.pyplot as plt

# 生成模拟数据

X, _ = make_blobs(n_samples=300, centers=4, random_state=42)

# 使用高斯混合聚类,设置组件数为4,随机种子42

gmm = GaussianMixture(n_components=4, random_state=42)

gmm.fit(X)

# 获取聚类结果

labels = gmm.predict(X)

# 可视化结果

plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')

plt.title('高斯混合聚类')

plt.xlabel('特征1')

plt.ylabel('特征2')

plt.show()

在这段代码中:

  1. 导入GaussianMixture用于实现高斯混合聚类,make_blobs用于生成数据,matplotlib.pyplot用于可视化。
  1. 使用make_blobs生成模拟数据。
  1. 初始化GaussianMixture模型,设置n_components为 4,表示我们假设数据由 4 个高斯分布混合生成,random_state设置为 42 保证结果可复现。
  1. 使用fit方法对数据进行训练,训练完成后,使用predict方法获取每个数据点的聚类标签。
  1. 最后,通过matplotlib将数据点进行可视化,不同簇的数据点用不同颜色表示。

第 5 章 总结与展望

原型聚类作为聚类算法中的重要类别,通过寻找数据集中的原型来揭示数据的内在结构。我们详细介绍了 K-Means、学习向量量化(LVQ)和高斯混合聚类这三种常见的原型聚类算法,它们各自有着独特的原理、适用场景和优缺点。

K-Means 算法简单高效,易于实现和理解,在数据分布较为均匀且簇形状规则的场景中表现出色,但它对初始值敏感,需要预先指定 K 值。学习向量量化(LVQ)算法结合了监督信息,适用于数据点分布密集且簇边界清晰的场景,尤其在图像识别和模式分类领域发挥着重要作用。高斯混合聚类基于概率模型,能够灵活地捕捉簇的形状和大小变化,适用于簇形状不规则或数据分布复杂的情况。

通过 Python 实战,我们利用scikit-learn和sklvq等库实现了这些算法,对随机生成的数据进行聚类,并通过可视化直观地展示了聚类结果,进一步加深了对算法的理解和掌握。

展望未来,随着大数据和人工智能技术的飞速发展,原型聚类将在更多领域展现其应用潜力。在大数据环境下,如何提高原型聚类算法的可扩展性和效率,以处理海量数据,是一个重要的研究方向。与深度学习等前沿技术的融合也将为原型聚类带来新的发展机遇,例如将深度学习的特征提取能力与原型聚类相结合,可能会产生更强大的聚类模型,实现更精准的数据分析和模式挖掘。同时,增强聚类结果的可解释性,使算法能够更好地服务于实际业务决策,也将是未来研究的重点之一。相信在不断的探索和创新中,原型聚类将为我们揭示更多数据背后的奥秘,推动各领域的发展和进步。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐