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() 方法将模型拟合到数据集。最后,我们打印算法识别的聚类标签和示例。
执行此代码时,它将生成以下绘图作为输出 −
此外,它将在终端上打印以下输出 −
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 会导致较慢的收敛。
总体而言,亲和传播是一种强大的聚类算法,它可以自动识别聚类数量,并且不需要预先指定的聚类数量。但是,它的计算成本可能很高,并且可能不适用于非常大的数据集。