scikit-learn中机器学习聚类方法实战

聚类导论

在scikit-learn 中 未标记的数据的 聚类(Clustering) 可以使用模块sklearn.cluster来实现。

每个聚类算法(clustering algorithm)都有两个变体: 一个是 类(class), 它实现了 fit 方法来学习训练数据的簇(cluster),还有一个 函数(function),当给定训练数据,返回与不同簇对应的整数标签数组(array)。对于类来说,训练数据上的标签可以在 labels_ 属性中找到。

聚类方法概述

当簇具有特殊的形状,即非平面流体(译注:即该流体的高斯曲率非0),并且标准欧氏距离不是正确的度量标准(metric)时,非平面几何聚类(Non-flat geometry clustering)是非常有用的。这种情况出现在上图的两个顶行中。

用于聚类(clustering)的高斯混合模型(Gaussian mixture models),专用于混合模型描述在 文档的另一章节 。可以将 KMeans 视为具有每个分量的协方差(equal covariance per component)相等的高斯混合模型的特殊情况。

K-means

KMeans 算法通过把样本分离成 n 个具有相同方差的类的方式来聚集数据,最小化称为 惯量(inertia) 或 簇内平方和(within-cluster sum-of-squares)的标准(criterion)。该算法需要指定簇的数量。它可以很好地扩展到大量样本(large number of samples),并已经被广泛应用于许多不同领域的应用领域。

k-means 算法将一组 N 样本 X 划分成 K 不相交的簇 C, 每个都用该簇中的样本的均值 \mu_j 描述。 这个均值(means)通常被称为簇的 “质心(centroids)”; 注意,它们一般不是从 X 中挑选出的点,虽然它们是处在同一个空间。

K-means(K-均值)算法旨在选择一个质心, 能够最小化惯性或簇内平方和的标准:
scikit-learn中机器学习聚类方法实战
惯性被认为是测量簇内聚程度的度量(measure)。 它有各种缺点:

  • 惯性假设簇是凸(convex)的和各项同性(isotropic),这并不是总是对的。它对 细长的簇或具有不规则形状的流行反应不佳。
  • 惯性不是一个归一化度量(normalized metric): 我们只知道当惯量的值较低是较好的,并且零是最优的。但是在非常高维的空间中,欧氏距离往往会膨胀(这就是所谓的 “维度诅咒/维度惩罚”(curse of dimensionality))。在 k-means 聚类算法之前运行诸如 PCA 之类的降维算法可以减轻这个问题并加快计算速度。
  • scikit-learn中机器学习聚类方法实战
    K-means 通常被称为劳埃德算法(Lloyd’s algorithm)。简而言之,该算法可分为三个步骤。第一步是选择初始质心,最基本的方法是从 X 数据集中选择 k 个样本。初始化完成后,K-means 由接下来两个步骤之间的循环组成。 第一步将每个样本分配到其最近的质心。第二步通过取分配给每个先前质心的所有样本的平均值来创建新的质心。计算旧的和新的质心之间的差异,并且算法重复这些最后的两个步骤,直到该值小于阈值。换句话说,算法重复这个步骤,直到质心不再显著移动。
    scikit-learn中机器学习聚类方法实战
    K-means 相当于具有小的全对称协方差矩阵(small, all-equal, diagonal covariance matrix)的期望最大化算法(expectation-maximization algorithm)。

该算法也可以通过 Voronoi diagrams(Voronoi图) 的概念来理解。首先,使用当前质心计算点的 Voronoi 图。 Voronoi 图中的每个段(segment)都成为一个单独分离的簇。其次,质心被更新为每个段的平均值。然后,该算法重复此操作,直到满足停止条件。 通常情况下,当迭代之间的目标函数(objective function)的相对减小小于给定的公差值(tolerance value)时,算法停止。在此实现中不是这样: 当质心移动小于公差时,迭代停止。

给定足够的时间,K-means 将总是收敛的,但这可能是局部最小。这很大程度上取决于质心的初始化。 因此,通常会进行几次初始化不同质心的计算。帮助解决这个问题的一种方法是 k-means++ 初始化方案,它已经在 scikit-learn 中实现(使用 init=‘k-means++’ 参数)。 这将初始化质心(通常)彼此远离,导致比随机初始化更好的结果,如参考文献所示。

该算法支持样本权重功能,该功能可以通过参数sample_weight实现。该功能允许在计算簇心和惯性值的过程中,给部分样本分配更多的权重。 例如,给某个样本分配一个权重值2,相当于在dataset X 中增加一个该样本的拷贝。

存在一个参数,以允许 K-means 并行运行,称为 n_jobs。给这个参数赋予一个正值指定使用处理器的数量(默认值: 1)。值 -1 使用所有可用的处理器,-2 使用全部可用处理器减一,等等。并行化(Parallelization)通常以内存的代价(cost of memory)加速计算(在这种情况下,需要存储多个质心副本,每个作业(job)使用一个副本)。