Advertisement

Choosing the Right Number of Clusters for kMeans Cluste

阅读量:

作者:禅与计算机程序设计艺术

1.简介

分类技术(clustering)作为无监督学习策略中的一种重要方法,在数据样本分组方面具有显著应用价值。其中K均值聚类算法作为一种经典的机器学习模型,在实际应用中具有广泛的使用基础。本文将深入探讨k均值聚类算法的具体运行机制及其优化目标函数的选择标准、模型复杂度评估指标等相关技术细节,并着重分析不同参数设置对最终分群效果的影响。最后部分将深入探讨影响聚类效果的关键因素。

2.基本概念术语说明

2.1 K-means聚类概述

该算法属于无监督学习范畴,并主要用于将数据集划分为若干互不重叠的子集。这些子集具有同一类别特征的数据点,并通过特定指标衡量其聚类效果。其中常用的评价指标包括轮廓系数(silhouette coefficient)、汇聚度(homogeneity)、完全松弛性(completeness)、F值(F measure)或轮廓分割方差(silhouette variance)。在实践中通常采用欧氏距离(Euclidean distance)作为计算样本间相似性的度量方法。

考虑给定样本集X=\{x_1,x_2,\cdots,x_N\},其中每个样本x_i\in R^d。设预设聚类数目为K个,则目标簇集合为C=\{c_1,c_2,\cdots,c_K\}。其中每个簇c_j\subseteq X满足第j个簇中的样本数量为n_j(j=1,…,K)。基于以下机制迭代优化以获得最佳聚类方案:

初始化阶段:从数据集中随机选定K个样本点作为初始中心点c_1, c_2,..., c_K
循环更新阶段:

  • 计算样本与各中心点之间的距离,并将该样本归入与其最近中心点所属的簇。
  • 重新计算各簇的新中心位置。
  • 当前后两次迭代所得结果完全一致时终止迭代。

基于K-means算法第2步中对质心重新确定的计算公式可以看出,在聚类过程中质心的位置确实具有重要影响因素;这也就意味着采用不同的初始质心策略可能会影响到最终聚类效果的质量差异。

2.2 K-means聚类优化目标选择标准

在聚类分析中,受样本集合随机性的影响因素主要包含初始点位置以及所选质心数量等变量。这些变量的选择将直接影响最终聚类结果的质量。针对不同应用场景以及数据量规模的特点差异,在实际应用中应根据不同场景和数据量选择最合适的优化目标函数。常用的目标函数包括均方误差(MSE)、轮廓系数(SIL)、互信息(MI)以及F测值(F-score)等指标。其中MSE指标主要用来评估模型的整体预测误差水平;而轮廓系数则反映单个样本与簇之间的区分度,在此指标下值越大表示该样本与自身簇成员越远,在一定程度上容易受到异常值的影响;基于熵权重计算的互信息指标则侧重于衡量两个样本集之间的相似程度;F测值则是从精确率与召回率两个维度对模型分类性能进行全面考量的结果。此外,在这些常见指标之外还有一些其他评价标准方法如密度聚类方法(Density-Based Clustering),其显著优势在于能够在一定程度上减少局部化误差带来的负面影响。

2.3 模型复杂度评估指标

另一个关键因素是模型复杂度评估指标。该指标大小直接关联着聚类结果的质量与稳定性,在数据科学领域中被广泛认为是衡量算法性能的重要标准之一。值得注意的是,在不同聚类算法中,参数数量往往具有不同的意义,在实际应用中应特别谨慎地进行比较与解读。此外,在深入分析模型运行机制时还可以从以下几个维度入手:首先考察各项统计指标;其次关注各簇之间的距离分布情况;最后研究样本空间中的密度分布特征等多方面信息。

2.4 数据分布不平衡问题

尽管K-means聚类是一种简明有效的聚类方法但其存在一些局限性首先该算法对初始质心的随机化设置较为敏感当遇到数据分布不均衡的情况容易导致分类结果偏差其次K-means算法作为一种迭代优化型方法其初始质心的选择以及参数配置直接影响最终的分类效果此外由于该算法每次仅更新一个样本点因此难以有效处理数据噪声并导致收敛效率低下这些限制因素促使研究者们提出了一系列改进方案如层次聚类技术(hierarchical clustering)谱聚类方法(spectral clustering)流形学习理论(manifold learning)以及基于密度的DBSCAN算法等这些改进型算法能够在保证分类精度的同时显著提升适用性以满足更多现实场景需求

3.核心算法原理和具体操作步骤以及数学公式讲解

K-means聚类可以分为两步:

初始化阶段:通过随机选择K个中心点c_1, c_2,..., c_K来确定初始位置。
循环更新阶段:
对于每个数据点x_i,计算它与所有质心中的距离,并将其归类到与其最近的质心所属的簇中。
重新定位各簇的核心位置(即新质心),以使每个簇中的数据点与新质心中的距离之和最小。
直到满足收敛标准。

3.1 初始化阶段

我们假设样本集合

(1) 普通随机初始化法

随机选取K个样本点作为中心点,例如:

(2) K-means++初始化法

基于中心点展开逐步生成,在每次生成一个新的样本点之后计算新样本与现有所有中心点之间的距离并根据距离大小进行排序随后选择离当前最近的空缺将其选为新的样本集中的核心元素直到完成了K个核心元素的选择过程

K-means++算法的伪代码如下:

复制代码
    def init_centers(X, K):
    centers = [None] * K
    
    # select the first center randomly
    idx = np.random.randint(len(X))
    centers[0] = X[idx]
    
    # generate the remaining K-1 points using K-means++ initialization method
    for i in range(1, K):
        dists = []
        for j in range(len(X)):
            if is_neighbor(centers[:i], X[j]):
                continue
    
            d = min([distance(X[j], C) for C in centers])
            dists.append((j, d))
    
        max_dist = max(dists, key=lambda x: x[1])[1]
        best_idx = random.choice([j for j, d in dists if d == max_dist])
        centers[i] = X[best_idx]
    
    return centers
    
    def is_neighbor(centers, x):
    for center in centers:
        if distance(center, x) < eps:
            return True
    return False
    
    def distance(x, y):
    pass
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

3.2 循环更新阶段

K-means聚类通过如下方式迭代地寻找最优的聚类结果:

  • 对于每个样本x_i,计算该样本与各质心之间的距离,并将其归入离它最近的质心所属的簇。
  • 重新确定各簇的中心位置,并以使各簇的新中心位置基于所有样本与现有质心的距离进行重新计算。
  • 直到满足收敛标准。

(1)距离度量

在K-means聚类中,在处理数据时我们通常会采用欧几里得距离作为最基础的距离度量方法。具体而言,在数学上可以表示为d(\boldsymbol{x}_i, \boldsymbol{c_j})= ||\,\bex_i - \bex_j\,\|其中\bex_i表示第i个样本点而\bex_j则表示第j个质心中心的位置坐标这一指标能够有效衡量两个点之间的差距然而,在实际应用中当数据的维度较高时这种基于欧几里得空间的传统方法可能会导致计算负担变得沉重为此在实践中常用的几种包括L1范数距离L2范数距离KL散度以及JS散度等这些不同的测量标准不仅能够帮助我们更好地理解数据分布还能对最终的聚类结果质量产生显著影响

(2)分配规则

K-means算法主要采用了一种较为简化的策略来实现数据分组。具体而言,即通过计算每个样本与各个质心之间的距离并选择最小的那个来确定其归属,从而实现了对数据集的有效划分。这一规则能够有效保持数据的空间特性,进而提高了整体的一致性和稳定性。值得注意的是,在实际应用中,当数据集存在类别不平衡的问题时,可能会导致某些簇群较之其他簇更为密集或稀疏的情况出现。针对这一挑战,可以考虑引入轮廓系数(silhouette coefficient)或其他聚类指标作为评估和优化的标准,从而进一步提升算法性能和结果质量

(3)簇中心更新方法

对于簇中心的更新方法,有两种常见方法:

(a) 固定簇大小法

对于每个簇C_j来说,假设有n_j个样本点属于该簇,则其对应的簇中心更新方法为:

\bar{\boldsymbol{c}}_j=\frac{1}{n_j}\sum_{i=1}^{n_j} \boldsymbol{x}_{ij}

其中\bar{\boldsymbol{c}}_j表示第j个簇的具体中心坐标值;而\boldsymbol{x}_{ij}则代表了该簇中第i个样本点的空间坐标位置(其中i=1,2,\cdots,n_j)。

(b) 可变簇大小法

对于簇j中的每个样本i而言,在计算其重要性度量时遵循以下公式:w_{ij}=f(\boldsymbol{x}_{ij}, c_j)其中函数f(\boldsymbol{x}_{ij}, c_j)被定义为非负值。即用于更新簇中心的方法是:将所有属于该簇的所有样本与其对应中心点之间的加权均值进行计算。具体而言,在计算过程中分子部分是对所有属于该簇的所有样本与其对应中心点之间的加权向量进行求和运算得到的结果向量;而分母则对该加权向量进行模长求和运算以获得归一化因子。这样做的目的是为了确保最终得到的新的簇中心位置能够准确反映当前所有样本的重要程度所决定的位置。”

不同簇之间权重的分配可以使用聚类算法来实现。

(4)收敛条件

在K-means聚类算法的迭代更新阶段中,在每一次迭代过程中都需要计算两个次近邻簇中心间的距离变化以及半径的变化情况以确定是否满足收敛标准。当两个中心点之间的距离变化量低于设定的阈值\epsilon的同时, 簇半径的变化量也必须低于设定的阈值\delta时从而判定系统已收敛至全局最优解

3.3 K-means聚类中的算法复杂度

该算法的时间计算结果表明其具有较高的效率,在特定条件下能够达到较快的收敛速度。具体而言,在每次迭代过程中需要执行以下操作:首先计算数据点与当前质心之间的距离(称为距离计算),然后根据距离大小将数据点分配到相应的类别中(即分配过程)。此外,在每一步运算中还需要维护一个记录表来追踪每个数据点所属的类别及其相关的属性值(即信息维护过程)。该算法的空间资源需求主要集中在存储各个类别中的数据以及相关的中间结果上(即资源占用情况)。

4.具体代码实例和解释说明

4.1 sklearn中的K-means聚类

scikit-learn库支持K均值聚类功能模块。一旦该模块被导入到环境中,我们就可以生成一个包含多组样本数据的numpy数组。

复制代码
    import numpy as np
    from sklearn.cluster import KMeans
    
    np.random.seed(42)
    X = np.random.rand(100, 2)   # 创建100个二维样本
    
      
      
      
      
    
    代码解读

设置簇的个数K:

复制代码
    kmeans = KMeans(n_clusters=3, random_state=42).fit(X)    # 设置簇的个数为3
    
    
    代码解读

执行拟合过程以训练模型,并生成一个KMeans对象;利用其属性labels_可获得每个样本所属的簇索引。

复制代码
    print(kmeans.labels_)     # 查看每个样本对应的簇索引
    
    
    代码解读

得到的输出为:

复制代码
    array([2, 1, 2,..., 1, 2, 1], dtype=int32)
    
    
    代码解读

这样就完成了一个简单的K-means聚类任务。

4.2 K-means聚类中的参数调优

在K-means聚类算法中, 合理选择初始质心位置, 采用适当的距离计算方法, 设定恰当的聚类数目以及设定合理的收敛终止条件等都是影响算法效果的关键因素. 通过调参实例来展示这些参数对算法性能的具体影响.

(1)设置簇数K

聚类结果由参数K的数量决定,在实际应用中通常建议在验证集中确定最佳的K值以优化分类效果。`\texttt{KMeans}`类提供了一个名为`\texttt{inertia_}`的属性用于衡量模型内部紧凑性。\该属性通过最小化各簇内部点与簇中心之间距离平方和来评估模型质量:即通过最小化各簇内部点与簇中心之间距离平方和来评估模型质量:

复制代码
    km = KMeans(n_clusters=5, random_state=42).fit(X)
    print("inertia:", km.inertia_)     # 查看模型的内聚度
    
      
    
    代码解读

得到的输出为:

复制代码
    inertia: 79.28602609924386
    
    
    代码解读

通过调整K值,可以在验证集上获得更好的模型效果。

(2)设置初始质心

K-means聚类算法中, 质心的位置对聚类结果具有关键性的影响. 该算法能够有效地加快全局最优解的搜索速度. 为了提高效率和准确性, 在实际应用中通常会采用两类不同的初始质心设定方法:

  1. 随机初始化:init="random"
  2. K-means++初始化:init="k-means++"

在实际应用场景中,通常推荐采用默认的随机初始化方式;相比之下具有更高的效率。然而,在特定情况下例如当样本分布呈现明显的不均衡性时,则应优先考虑采用K-means++初始化策略。具体而言,在某些特定条件下采用K-means++初始化策略能够显著提升聚类效果。

复制代码
    km = KMeans(n_clusters=5, init="k-means++", random_state=42).fit(X)
    print("inertia:", km.inertia_)     # 查看模型的内聚度
    print("labels:", km.labels_)       # 查看每个样本对应的簇索引
    
      
      
    
    代码解读

得到的输出为:

复制代码
    inertia: 61.43382756922644
    labels: [1 3 3... 4 2 2]
    
      
    
    代码解读

(3)设置距离度量

在K-means聚类算法中选择不同的距离度量会对聚类结果产生显著影响。常见的几种包括欧氏距离、曼哈顿距离和切比雪夫_distance等_其他数学公式...其他数学公式...其他数学公式...其他数学公式...其他数学公式_其他数学公式...其他数学公式_其他数学公式_以及其他一些特定的应用场景下可能需要用到更复杂的计算方式或其他变种方法来满足特定需求或优化性能等方面的要求

下面,使用自定义距离度量函数来实现相同的聚类效果:

复制代码
    from scipy.spatial.distance import euclidean
    
    def custom_metric(a, b):
    return abs(a[0]-b[0])+abs(a[1]-b[1])/2.0
    
    km = KMeans(n_clusters=5, metric=custom_metric, random_state=42).fit(X)
    print("inertia:", km.inertia_)     # 查看模型的内聚度
    print("labels:", km.labels_)       # 查看每个样本对应的簇索引
    
      
      
      
      
      
      
      
    
    代码解读

得到的输出为:

复制代码
    inertia: 79.28602609924386
    labels: array([2, 3, 2,..., 2, 1, 1], dtype=int32)
    
      
    
    代码解读

(4)设置收敛阈值

K-means聚类算法中, 收敛标准的设定对最终结果具有显著影响. 通常情况下, K-means算法通过超参数max_iter限定算法的最大运行次数. 当算法未能充分完成迭代过程时, 可以通过设定终止条件来结束运算.

下面,设置收敛条件tol,若两次中心距离的变化小于阈值,则停止迭代:

复制代码
    km = KMeans(n_clusters=5, tol=1e-4, random_state=42).fit(X)
    print("inertia:", km.inertia_)     # 查看模型的内聚度
    print("labels:", km.labels_)       # 查看每个样本对应的簇索引
    
      
      
    
    代码解读

得到的输出为:

复制代码
    inertia: 79.28602609924386
    labels: array([2, 3, 2,..., 2, 1, 1], dtype=int32)
    
      
    
    代码解读

5.未来发展趋势与挑战

该算法已被广泛认可为经典的聚类方法,在众多数据分析场景中发挥着基础作用。其发展历程悠久,并已在多个领域得到广泛应用。在深度学习的兴起背景下,传统的K-means聚类方法逐渐被新兴的深度学习技术取代。

K-means聚类有以下几个局限性:

  1. K-means算法主要适用于具有凸形状(convex shapes)的数据分布(data distributions),对于具有明显非凸形状的数据集(non-convex datasets),其聚类效果可能会受到限制。
  2. 该算法由于没有从整体上把握样本分布特征(distributional characteristics of samples),因而难以识别出数据内部潜在的结构模式。
  3. K-means算法对数据中的缺失信息和异常点较为敏感(sensitive to missing data and outliers),尤其是在处理大规模数据集时容易导致较大的聚类误差(clustering errors)。
  4. 由于该方法难以适应复杂多样的拓扑结构(topological structures),其聚类结果往往会在增加簇的数量时趋向于局部最优解(local optima)。
  5. 相较于其他聚类方法,在处理大规模数据时效率较低(low efficiency),这一特性主要源于初始质心选取的影响(influence of initial centroid selection)而非数据分布特征。

鉴于此原因分析显示,在深度学习技术迅速发展的背景下,传统的K-means聚类算法正逐渐取代其主导地位,并被新兴的深度学习方法所替代。当前的主要发展趋势涵盖三个关键领域:

  1. 采用梯度下降优化算法来进行深度神经网络的训练工作。该算法能有效求解连续函数的极值问题,并且由于K-means聚类分析的目标质心也是连续变化的特性,在这种情况下也可以实现对其的有效训练。
  2. 替代传统的基于距离度量的方法作为目标函数选择标准的是交叉熵损失函数这一指标体系。通过将样本间差异程度量化为概率分布之间的交叉熵损失指标,在一定程度上能够更准确地反映真实数据间的固有特征。
  3. 当标签信息缺失或者样本数量不足时,则建议采用基于隐变量的生成式模型来进行辅助聚类分析工作支持这一观点的理由在于这种类型的模型能够更加精确地捕捉数据的整体分布规律,并且在一定程度上具有较强的抗噪声能力这使得它在提升聚类分析效果方面具有显著的优势。

深度学习方法的这些突破口意味着,K-means聚类未来的发展方向可能是:

  1. 深度学习技术得以更精准地提取样本内在特征,并能构建多层次类别体系。
  2. 高效地完成复杂数据分布建模,并能避免传统K-means算法依赖距离计算的问题。
  3. 深度学习模型具备更强捕捉局部模式的能力,并能实现对这些细节进行独立处理。
  4. 通过全局视角分析各类别之间的联系,并结合细致入微的研究方式来提升整体效果。
  5. 深度学习模型采用更为灵活的方法,在不同层次间实现了自适应的学习机制。

全部评论 (0)

还没有任何评论哟~