Affinity Propogation最初是由Brendan Frey 和 Delbert Dueck於2007年在Science上提出的。相比其它的聚類算法,Affinity Propogation算法不需要預先指定聚類個數。
Affinity Propogation算法的原理可以簡單的概括爲:每一個數據點都會給其它的多有點發送信息,告知其它所有點每個目標對發送者(sender)的相對吸引力的目標值(target)。
隨後,鑑於從所有其它sender收到信息的“attractiveness”,每個target所有sender一個回覆,以告知與sender相聯繫的每一個sender的可用性。sender會給target回覆相關信息,以告知每一個target對sender修正的相對“attractiveness”(基於從所有target收到的關於可用性的信息)。信息傳遞的整個過程直到達成一致纔會停止。
一旦sender與某個target相聯繫,這個target就會稱爲該點(sender)的“典型代表(exemplar)”。所有被相同exemplar標記的點都被放置在一個聚類中。
算法
假定一個如下的數據集。每一個參與者代表一個五維空間的數據點。
相似性矩陣(C)
除了在對角線上的元素外,其它的元素是負的均方誤差作爲兩個數據間的相似值。計算公式如下:
以Alice和Bob爲例,兩者間的相似性計算過程如下:
因此,Alice與Bob之間的相似值爲-7。
相似性值的計算邊界出現在Bob和Edna間:
Bob和Edna之間的相似值爲-22。
通過逐步的計算,最後得到的結果如下:
一般對角線上的元素取相似值中較小的數,在本例中取值爲-22,因此,得到的相似性矩陣如下:
Responsibility Matrix ®
這裏的responsibility matrix 是中間的過度步驟。通過使用如下的公式計算responsibility matrix:
其中,i表示協同矩陣的行,k表示列的關聯矩陣。
例如,的值爲-1, 首先提取similarity matrix中的值爲-7, 減去similarity matrix中Alice行的最大值爲-6,因此,得到。
取值的邊界爲,其計算如下:
根據上述公式計算得到的最終結果如下圖所示:
Availability Matrix (a)
Availability Matrix的初始值爲矩陣中的所有元素均爲0。
首先,計算對角線上的元素值:
其中,i表示協同矩陣的行,k表示協同矩陣的列。
實際上,上面的公式只告訴你沿着列,計算所有行與0比較的最大值(除列序與行序相等時的情況除外)。例如,的計算如下:
其次,計算非對角線上的元素值,分別以和爲例,其計算過程如下所示:
以下公式是用於更新Availability Matrix,其公式如下:
當你想要更新的值時,其計算過程如下:
最後得到的結果如下表所示:
Criterion Matrix ©
在得到上面的availability matrix後,將availability matrix和responsibility matrix的對應元素相加,便可得到criterion matrix。
其計算公式如下:
最後得到的criterion matrix的結果如下:
以上便是Affinity Propogation算法的計算過程,這是我見過最淺顯易懂的講解了,詳見原文。
代碼示例如下:
首先,導入相關庫:
import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()
from sklearn.datasets.samples_generator import make_blobs
from sklearn.cluster import AffinityPropagation
使用scikit-learn生成需要的數據集,詳見如下:
X, clusters = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
plt.scatter(X[:,0], X[:,1], alpha=0.7, edgecolors='b')
訓練模型(因爲是無監督算法,因此不需要拆分訓練集和測試集):
af = AffinityPropagation(preference=-50)
clustering = af.fit(X)
最後,將不同聚類的點可視化:
plt.scatter(X[:,0], X[:,1],
c=clustering.labels_, cmap='rainbow', alpha=0.7,
edgecolors='b')
算法使用場景:
Affinity Propagation是一個無監督的機器學習算法,它尤其適用於那些不知道最佳聚類數情況的算法。