Machine Learning 简明教程

Machine Learning - Affinity Propagation

亲和传播是一种聚类算法,它识别数据集中的“示例”,并将每个数据点分配给其中一个示例。它是一种不需要预先指定聚类数量的聚类算法,使其成为探索性数据分析的有用工具。亲和传播是 Frey 和 Dueck 在 2007 年提出的,此后已广泛应用于生物学、计算机视觉和社交网络分析等多个领域。

亲和传播背后的思想是迭代更新两个矩阵:责任矩阵和可用性矩阵。责任矩阵包含有关每个数据点作为另一个数据点的示例有多合适的信息,而可用性矩阵包含有关每个数据点多想选择另一个数据点作为示例的信息。该算法在更新这两个矩阵之间交替,直到收敛。根据责任矩阵中的最大值选择最终示例。

Implementation in Python

在 Python 中,Scikit-learn 库提供了 AffinityPropagation 类来实现 Affinity Propagation 算法。该类采用多个参数,包括 preference 参数,该参数控制选择多少个示例,以及 damping factor,该参数控制算法的收敛速度。

以下是如何使用 Python 中的 Scikit-learn 库实现亲和传播的一个示例 −

Example

from sklearn.cluster import AffinityPropagation
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

# generate a dataset
X, _ = make_blobs(n_samples=100, centers=4, random_state=0)

# create an instance of the AffinityPropagation class
af = AffinityPropagation(preference=-50)

# fit the model to the dataset
af.fit(X)

# print the cluster labels and the exemplars
print("Cluster labels:", af.labels_)
print("Exemplars:", af.cluster_centers_indices_)
#Plot the result
plt.figure(figsize=(7.5, 3.5))
plt.scatter(X[:, 0], X[:, 1], c=af.labels_, cmap='viridis')
plt.scatter(af.cluster_centers_[:, 0], af.cluster_centers_[:, 1], marker='x', color='red')
plt.show()

在这个示例中,我们首先使用 Scikit-learn 的 make_blobs() 函数生成一个合成数据集。然后我们使用偏好值为 -50 创建一个 AffinityPropagation 类的实例,并使用 fit() 方法将模型拟合到数据集。最后,我们打印算法识别的聚类标签和示例。

执行此代码时,它将生成以下绘图作为输出 −

affinity propagation

此外,它将在终端上打印以下输出 −

Cluster labels: [3 0 3 3 3 3 1 0 0 0 0 0 0 0 0 2 3 3 1 2 2 0 1 2 3 1 3 3 2 2 2 0 2 2 1 3 0 2 0 1 3 1 0 1 1 0 2 1 3 1 3 2 1 1 1 0 0 2 2 0 0 2 2 3 2 0 1 1 2 3 0 2 3 0 3 3 3 1 2 2 2 0 1 1 2 1 2 2 3 3 3 1 1 1 1 0 0 1 0 1]
Exemplars: [9 41 51 74]

Affinity Propagation 中的 preference 参数控制所选示例的数量。较高的偏好值会导致更多示例,而较低的偏好值会导致更少示例。damping factor 控制算法的收敛速度,较大的 damping factors 会导致较慢的收敛。

总体而言,亲和传播是一种强大的聚类算法,它可以自动识别聚类数量,并且不需要预先指定的聚类数量。但是,它的计算成本可能很高,并且可能不适用于非常大的数据集。

Advantages of Affinity Propagation

亲和传播的使用优点如下−

  1. 亲和传播可以自动识别簇的数量,而无需预先指定簇的数量。

  2. 它可以处理任意形状和大小的簇。

  3. 它可以处理具有噪声或不完整数据的DataSet。

  4. 它对初始参数的选择相对不敏感。

  5. 在某些类型的DataSet上,它已被证明优于其他聚类算法。

Disadvantages of Affinity Propagation

以下是一些使用亲和传播的缺点−

  1. 对于大型DataSet或具有众多特征的DataSet,它在计算上可能是昂贵的。

  2. 它可能会收敛到次优解,尤其是在数据具有高度可变性或噪声的情况下。

  3. 它可能会对阻尼因子的选择敏感,阻尼因子控制收敛速度。

  4. 它可能会产生很多小簇或仅包含一个或几个成员的簇,这些簇可能没有意义。

  5. 可能难于解释所产生的簇,因为算法没有提供有关簇的含义或特征的明确信息。