机器学习 - 亲和传播



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

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

Python 实现

在 Python 中,Scikit-learn 库提供了 AffinityPropagation 类来实现亲和传播算法。该类采用多个参数,包括 preference 参数(控制选择的示例数量)和 damping 参数(控制算法的收敛速度)。

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

示例

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() 函数生成一个合成数据集。然后,我们创建一个 preference 值为 -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]

亲和传播中的 preference 参数控制选择的示例数量。较高的 preference 值会导致更多示例,而较低的 preference 值会导致更少示例。damping 参数控制算法的收敛速度,较大的 damping 值会导致较慢的收敛。

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

亲和传播的优点

以下是使用亲和传播的优点:

  • 亲和传播可以自动识别聚类数量,而无需预先指定聚类数量。

  • 它可以处理任意形状和大小的聚类。

  • 它可以处理具有噪声或不完整数据的数据集。

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

  • 它已被证明在某些类型的数据集上优于其他聚类算法。

亲和传播的缺点

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

  • 对于大型数据集或具有许多特征的数据集,它可能计算成本很高。

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

  • 它可能对 damping 参数的选择敏感,该参数控制收敛速度。

  • 它可能产生许多小的聚类或只有一个或几个成员的聚类,这些聚类可能没有意义。

  • 可能难以解释生成的聚类,因为该算法没有提供关于聚类含义或特征的明确信息。

广告