機器學習 - 親和傳播



親和傳播是一種聚類演算法,它識別資料集中的“示例”,並將每個資料點分配給這些示例中的一個。這是一種不需要預先指定聚類數量的聚類演算法,使其成為探索性資料分析的有用工具。親和傳播由 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 引數的選擇敏感,該引數控制收斂速度。

  • 它可能產生許多小的聚類或只有一個或幾個成員的聚類,這些聚類可能沒有意義。

  • 可能難以解釋生成的聚類,因為該演算法沒有提供關於聚類含義或特徵的明確資訊。

廣告