Sklearn 聚类

2025年3月17日 | 阅读11分钟

了解任何事物,例如音乐,的一种方法是寻找重要的分组或集合。虽然我们的朋友可能会按年代排列音乐,但我们可能会按流派排列音乐,我们选择的组有助于理解不同的元素。

什么是聚类?

聚类是无监督机器学习技术之一,它是一种在数据集中查找关联和模式的方法。然后根据具有许多相似特征的样本将数据集样本组织成不同的类别。由于它确保了可用未标记数据的自然聚类,因此聚类至关重要。

它被定义为一种根据数据点的相似性将其分类为不同类别的算法。可能相似的对象被保存在一个与其他集群几乎没有相似之处的集群中。

这是通过在未标记数据集中查找相似趋势(例如活动、大小、颜色和形状),然后根据是否存在此类趋势对数据进行分类来完成的。由于该算法是一种无监督学习技术,因此它在未标记数据集上运行并且不受监督。可以使用 Python 的 Scikit-learn 模块中的 sklearn.cluster 方法对未标记数据进行聚类。

既然我们熟悉了聚类,让我们来研究 SkLearn 中可用的各种聚类方法。

Python Scikit-learn 中的聚类方法

方法名参数可伸缩性 用例几何(使用的度量)
K-Means这需要我们想要的集群数量。样本量非常大,集群数量中等普遍适用,集群大小均匀,形状扁平,集群数量少,且具有归纳性。点与集群中心之间的距离
仿射传播它需要阻尼和样本偏好。它不随样本数量而伸缩。大量集群,可变集群大小,不规则几何形状,且具有归纳性它测量图距离(例如,最近邻图)
均值漂移它需要所需的带宽。它不随样本数量而伸缩。大量集群,可变集群大小,不规则几何形状,且具有归纳性它测量点之间的距离
谱聚类它需要集群的数量。可以扩展到中等数量的样本或少量集群转导性、非扁平几何形状、少量集群、甚至集群大小。它测量图距离(例如,最近邻图)
Ward 层次聚类它需要集群的数量或可接受的最大距离。它可以扩展到大量样本和集群数量转导性、大量集群,并且可能存在连接限制。它使用两点之间的距离作为其度量。
凝聚聚类它需要集群的数量或可接受的最大距离、链接类型和距离。它可以扩展到大量样本和集群数量有许多集群、潜在的连接限制、非欧几里得距离和转导性。它测量成对距离
DBSCAN它需要邻域的大小。它可以扩展到非常大量的样本和中等数量的集群。转导性、非扁平几何形状、不均匀的集群大小和异常值减少。它测量两个最近点之间的距离。
OPTICS它需要最小集群成员的数量。它可以扩展到非常大量的样本和大量集群。转导性、非扁平几何形状、不同的集群密度、不均匀的集群大小和异常值移除。它测量点之间的距离
高斯混合模型许多此方法不可伸缩归纳性,扁平几何形状,有助于估计密度。它测量到集群中心的马哈拉诺比斯距离。
BIRCH它需要分支因子、阈值和可选的全局聚类参数。它可以扩展到大量样本和集群数量大数据集、移除异常值、数据缩减和归纳性。此方法测量两点之间的欧几里得距离
二分 K 均值它需要集群的数量。它可以扩展到大量样本和中等数量的集群通用、均匀的集群大小、扁平形状、无空集群、归纳性和层次性。它测量点之间的距离。

K 均值

该算法计算不同数据类别的集群质心,然后通过迭代识别最佳质心。它假设给定数据集存在预先已知的集群,因为它需要集群数量作为其参数。这种聚类方法的基本思想是通过将样本分成 n 个具有相同方差的组来聚类所提供的数据,同时减少惯性约束。

k 代表集群的数量。Python Scikit-learn 具有 sklearn.cluster.KMeans 聚类来执行 KMeans 聚类。样本权重参数使 sklearn.cluster 能够计算集群中心和惯性值。KMeans 模块为某些样本提供额外权重。

K 均值聚类算法

k 均值聚类算法将 N 个样本集划分为 K 个不相交的集群,每个集群的均值用于表征其样本。尽管它们共享相似的空间,但均值通常被称为集群的“质心”。质心通常不是来自独立特征 X 的点。

K 均值聚类方法的目的是最小化集群内的平方和准则,或惯性。

k 均值聚类方法的算法可以概括为四个重要步骤,可用于根据样本特征的相似性将其聚类到不同的类别中。

从样本位置随机选择 k 个质心作为初始集群中心。

将每个样本点放置在其最近的质心旁边。

将质心放置在分配给集群的样本点中间。

重复步骤 2 和 3,直到达到用户定义的容差水平、最大迭代次数,或者直到观察到集群类别没有变化。

Python Scikit-Learn 聚类 KMeans

参数

n_clusters (int, 默认值 = 8):- 这个数字表示要创建的质心数量和要构建的集群数量。

Init ({'k-means++', 'random'}, 形状为 (n_clusters, n_features) 的类数组, 默认值 = 'k-means++'):- 初始化方法。

为了加快收敛速度,"k-means++" 为 k-均值聚类智能选择初始集群中心。

"random" 从数据集中随机选择集群观测值(行)的数量作为初始质心。

n_init (int, 默认值 = 10):- k-均值聚类算法将使用各种质心种子进行的迭代次数。最终分数将是 n_init 连续循环的惯性最小化的最佳结果。

max_iter (int, 默认值 = 300):- 这指定了单次运行中 k-均值聚类算法的最大迭代次数。

tol (float, 默认值 = 1e-4):- 收敛被定义为两次连续迭代的集群中心之间的距离,相对于 Frobenius 范数具有比例容差。

verbose (int, 默认值 = 0):- 详细模式。

random_state (int, RandomState 实例或 None, 默认值 = None):- 此参数确定如何生成质心初始化随机样本。通过使用 int 使随机化具有确定性。

copy_x (bool, 默认值 = True):- 在事先计算距离时,首先对数据进行中心化在定量上更精确。如果 x_copy 设置为 True(默认值),则初始数据不会更改。如果为 False,则在方法退出之前更改并恢复初始数据。

algorithm ({"lloyd", "elkan", "auto", "full"}, 默认值 = "lloyd"):- 指定要使用的 K 均值聚类方法的算法。

代码

输出

Sklearn Clustering
Sklearn Clustering

肘部法则

尽管 k-均值在我们的测试数据集上表现良好,但必须强调的是,它的局限性之一是,我们必须首先定义 k,即集群数量,然后才能确定理想的 k。在实际场景中,要选择的集群数量可能并不总是很明显,特别是当我们处理无法看到的高维数据集时。

肘部技术是一种有用的图形工具,用于确定特定活动的理想集群数量 k。我们可以推断,随着 k 的增长,集群内 SSE(或失真)将减少。这是因为数据将更接近其指定的质心。

代码

输出

Sklearn Clustering

层次聚类

使用自上而下或自下而上的策略从数据中形成集群称为层次聚类。它要么从一个包含数据集中所有样本的单一集群开始,然后将该集群分成更多的集群,要么从多个包含数据集中所有样本的集群开始,然后根据某些度量组合样本以生成具有更多度量的集群。

随着层次聚类的进行,结果可以看作是一个树状图。将“深度”与阈值联系起来有助于我们确定我们想要聚类的深度(何时停止)。

它有 2 种类型

凝聚聚类(自下而上策略): 从数据集的单个样本及其集群开始,我们根据某个标准不断将这些随机创建的集群组合成更突出的集群,直到过程结束时只剩下一个集群。

分裂聚类(自上而下策略): 在这种方法中,我们从一次将整个数据集组合成一个单一集群开始,然后继续将这个集群分解成多个较小的集群,直到每个集群只包含一个样本。

单链接: 通过这种链接方法,我们结合两个成员最相似的集群,使用来自每个集群中最相似的元素对。

全链接: 通过这种链接方法,我们从每个集群中选择最不同的样本,并将它们组合到具有最小相异距离的两个集群中。

平均链接: 在这种链接方法中,我们使用平均距离来配对每个集群中最相似的样本,并将包含最相似成员的两个集群组合成一个新组。

Ward: 这种方法减少了为所有集群对计算的平方距离之和的值。尽管该方法是分层的,但其思想与 KMeans 相同。

请注意,我们基于距离(通常是欧几里得距离)进行相似性比较。

参数

n_clusters (int 或 None, 默认值 = 2):- 算法要生成的集群数量。如果距离阈值参数不是 None,则它必须是 None。

affinity (str 或可调用对象, 默认值 = 'euclidean'):- 此参数建议用于链接计算的度量。L1、L2、Euclidean、Cosine、Manhattan 或 Precomputed 都是可能的选项。如果链接方法是 "ward",则只接受 "euclidean"。如果为 "precomputed",则 fit 技术需要邻近矩阵作为输入,而不是相似性矩阵)。

memory (str 或具有 joblib.Memory 接口的对象, 默认值 = None):- 它用于存储树计算的结果。默认情况下不进行缓存。如果提供了字符串,则指定访问缓存目录的路径。

connectivity (类数组或可调用对象, 默认值 = None):- 此参数接受连通性矩阵。

compute_full_tree ('auto' 或 bool, 默认值 = 'auto'):- 在 n_clusters 处,算法停止树的构建。

linkage ({'ward', 'single', 'complete', 'average'}, 默认值 = 'ward'):- 链接准则决定了应该使用哪个度量来计算观测集之间的距离。算法会将使该因子最小化的集群组合成一个集群。

distance_threshold (float, 默认值 = None):- 集群对之间的最大连通距离,超过该距离集群不能合并。如果未提供或为 None,则参数 compute_full_tree 和 n_clusters 都必须为 True。

compute_distances (bool, 默认值 = False):- 即使不使用距离阈值,此参数也会计算集群对之间的距离。可以使用此参数可视化树状图。但是,存在内存和计算开销。

代码

输出

Features of the dataset :  ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
Target feature of the dataset :  ['setosa' 'versicolor' 'virginica']
Size of our dataset :  (150, 2) (150,)

Sklearn Clustering

Score of the Agglomerative clustering algorithm with ward linkage:  0.8857921001989628

下一个主题Sklearn 教程