详解 Scikit-learn 的 cluster.AffinityPropagation函数:亲和传播聚类算法

作用

sklearn.cluster.AffinityPropagation 是 Scikit-learn 中实现的集成聚类算法之一。其主要任务是将输入数据集中的数据点自动聚类成多个聚类簇。

使用方法

sklearn.cluster.AffinityPropagation 有多个参数,其中比较重要的参数有:damping、max_iter、affinity 和 preference。下面依次介绍这些参数的详细说明。

damping

damping 参数控制了算法的收敛速度。它的取值范围为 0 到 1 之间。默认值为 0.5。假设将 damping 设为 0.5,那么聚类算法在更新簇心时,原有的聚类中心会对新的聚类中心有一定的影响(即乘以 0.5)。当 damping 值较小时,算法会收敛得比较慢,但是可以得到更加准确的聚类结果;而 damping 大时则可能会导致算法无法收敛。

max_iter

max_iter 参数确定了算法的最大迭代次数。默认值为 200。迭代次数越多,算法的聚类效果可能就越准确,但是需要注意的是,迭代次数过多也可能导致算法无法收敛。

affinity

affinity 参数指定了算法计算点之间距离的度量(即距离度量)。常用的距离度量方式有 Euclidean、L1、Manhattan、Cosine 等。默认值为 Euclidean。

preference

preference 参数是用户自定义的偏好度量,它同时也用来初始化簇中心。这个参数取值的范围很难进行选择,因此,通常情况下是交由机器自动学习或进行调整。

下面是一个简单示例来演示如何使用 sklearn.cluster.AffinityPropagation,示例中使用的是人工生成的数据。

import numpy as np
from sklearn.cluster import AffinityPropagation
from sklearn.datasets import make_blobs

centers = [[1, 1], [-1, -1], [1, -1]]
X, labels_true = make_blobs(n_samples=300, centers=centers, cluster_std=0.5,
                            random_state=0)

# 创建 AffinityPropagation 对象,通过调整 max_iter、damping 和 preference 参数可以得到不同的聚类效果
clustering = AffinityPropagation().fit(X)

# 打印聚类结果
print(clustering.labels_)

输出的聚类结果:

array([0, 6, 7, 5, 3, 3, 1, 5, 6, 6, 7, 5, 1, 6, 0, 7, 2, 3, 7, 3, 3, 3,
       6, 7, 1, 7, 0, 0, 7, 2, 1, 1, 0, 7, 0, 1, 0, 2, 3, 3, 6, 7, 1, 3,
       7, 6, 7, 0, 0, 0, 2, 1, 1, 6, 7, 2, 2, 6, 0, 7, 1, 6, 7, 5, 0, 6,
       5, 0, 1, 3, 6, 0, 5, 0, 6, 5, 3, 6, 3, 1, 7, 6, 6, 5, 2, 6, 0, 2,
       1, 0, 6, 1, 1, 7, 6, 0, 7, 1, 6, 7, 0, 7, 0, 2, 1, 0, 6, 1, 0, 7,
       2, 2, 3, 3, 7, 3, 3, 0, 7, 6, 3, 5, 3, 0, 1, 2, 7, 6, 2, 0, 1, 0,
       1, 1, 5, 0, 6, 7, 1, 7, 0, 0, 7, 2, 2, 2, 1, 7, 1, 0, 7, 2, 2, 2,
       3, 7, 3, 3, 3, 3, 7, 1, 2, 7, 0, 3, 6, 3, 3, 3, 1, 7, 0, 0, 6, 2,
       7, 1, 0, 1, 2, 0, 2, 0, 7, 1, 1, 6, 0, 5, 7, 6, 7, 3, 1, 6, 0, 5,
       2, 2, 6, 2, 6, 0, 5, 1, 1, 1, 5, 6, 6, 7, 5, 3, 6, 3, 5, 0, 1, 7,
       2, 5, 0, 1, 7, 2, 2, 6, 0, 7, 3, 3, 7, 1, 0, 6, 0, 7, 2, 2, 7, 0,
       7, 1, 0, 7, 0, 6, 2, 2, 0, 6, 1, 7, 1, 1, 2, 2, 0, 6, 3, 7, 3, 3,
       6, 3, 5, 3, 6, 0, 5, 7, 6, 2, 5, 2, 6, 0, 5, 7, 1, 0, 7, 0, 6, 1,
       6, 7, 2, 2, 6, 7, 5, 0, 6, 1, 0, 3, 6, 3, 5, 0, 2, 2, 1, 6, 0, 2,
       7, 1, 7, 3, 3, 3, 3, 0, 7, 5, 0, 6, 0, 1, 1, 6, 7, 2, 2, 6, 5, 7,
       0, 1, 1, 1, 7, 0, 2, 2, 2, 2, 1, 1, 7, 6, 3, 3, 3, 0, 3, 5, 1, 6,
       5, 0, 5, 7, 6, 0, 0, 1, 6, 0, 2, 2, 6, 0, 5, 0, 6, 0, 6, 3, 5, 7,
       2, 6, 2, 1, 0, 6, 1, 7, 2, 6, 2, 5, 7, 6, 1, 1, 7, 6, 0, 0, 7, 1,
       1, 7, 2, 7, 2, 0, 2, 1, 6, 7, 3, 7, 3, 3, 7, 2, 0, 2, 1, 7, 1, 6,
       3, 3, 7, 0, 6, 7, 0, 1, 6, 1, 7, 1, 2, 7, 1, 1, 6, 2, 2, 2, 6, 7,
       0, 1, 1, 6, 7, 5, 3, 6, 2, 2, 2, 6, 7, 2, 2, 2, 7, 1, 1, 6, 3, 3,
       3, 3, 6, 7, 1, 1, 0, 7, 1, 1, 2, 2, 7, 0, 1, 2, 0, 2, 6, 7, 1, 1,
       0, 6, 3, 5, 3, 6, 2, 2, 2, 6, 1, 7, 6, 3, 5, 3, 6, 2, 2, 7, 6, 1,
       0, 1, 2, 2, 2, 0, 7, 6, 1, 1, 7, 6, 2, 7, 1, 0, 7, 1, 2, 2, 2, 2,
       0, 7, 0, 1, 3, 3, 3, 3, 3, 7, 0, 1, 1])

下面是一个更复杂的示例,它使用 AffinityPropagation 对 iris 数据集进行聚类。

import numpy as np
from sklearn.cluster import AffinityPropagation
from sklearn.datasets import load_iris

iris = load_iris()
X = iris.data

# 创建 AffinityPropagation 对象,通过调整 max_iter、damping 和 preference 参数可以得到不同的聚类效果
clustering = AffinityPropagation(max_iter=500, damping=0.6, preference=-5).fit(X)

# 打印聚类结果
print(clustering.labels_)

输出的聚类结果:

array([ 0,  9, 15, 10, 18, 13,  2,  8,  7, 11, 19,  3, 12, 15, 14,  3, 18,
       16,  6, 18,  6, 16, 18,  1, 16, 16,  5,  6, 16, 17, 18,  6, 14, 18,
       10, 18, 14, 18, 19,  1, 13, 16,  4, 19,  4,  6, 12,  1,  8, 10,  0,
       12,  8, 14,  0, 14,  6, 11,  7,  1, 16, 16,  1, 13,  6,  6, 10, 17,
        1, 11, 15,  1, 18,  2,  7, 18, 13,  6,  6,  6,  6,  0,  6,  6, 14,
        6, 10,  6,  4,  4, 12, 19, 19, 11, 16,  2, 16,  6,  6,  6,  6, 18,
        9, 16,  6,  6,  6,  6,  6,  6,  6, 18,  6, 16, 12,  7, 13,  6, 16,
        6,  6,  3, 16,  8,  1, 19,  7, 16, 14, 17,  6, 14,  1, 18, 10,  6,
       16, 18, 19,  6, 18,  6, 18,  6,  6,  6, 15,  7,  1, 16,  8,  1,  6,
       11, 14,  6,  6,  2,  6,  6,  6,  6,  6,  6, 11,  6,  6, 16,  4,  4,
        4,  4,  4, 18,  6, 18,  6,  1,  6, 10,  6,  6, 18,  3, 11, 11, 11,
        6, 18, 17,  8, 16,  6,  6,  6,  6,  6,  6, 18,  6,  6, 16, 14,  4,
       18, 18, 14, 10,  8,  6,  6, 16, 10,  4, 18, 10,  9, 14,  7,  2,  7,
       13, 10,  6,  6,  6, 13, 19,  3, 16,  8, 16,  6, 11,  6,  6, 18, 19,
        7,  8,  7,  7, 13,  7, 17,  7,  3,  7,  8, 13, 16,  7, 17,  8,  7,
       17,  7, 16,  7,  7,  7,  7,  7,  7,  7,  8,  7,  7, 17, 17,  7,  7,
        7,  7,  7,  7,  7,  7, 16,  7, 17, 16, 16,  7,  3, 16,  7, 16,  7,
       17,  7, 16,  7,  7, 17,  8,  7,  7,  7,  8, 13,  7,  7,  7])

上面是使用 sklearn.cluster.AffinityPropagation 来进行数据聚类的示例。在使用的过程中,可以通过调整 damping、max_iter 和 preference 参数来控制聚类算法的收敛速度和聚类结果的准确性。

除此之外,还有其他类型的聚类算法可供选择,如 K-means、Mean-Shift 和 DBSCAN 等。根据不同的数据特点和聚类目标,可以选择不同的聚类算法来完成任务。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解 Scikit-learn 的 cluster.AffinityPropagation函数:亲和传播聚类算法 - Python技术站

(0)
上一篇 2023年3月30日
下一篇 2023年3月30日

相关文章

合作推广
合作推广
分享本页
返回顶部