聚類算法:Affinity Propogation算法學習指南!

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)

除了在對角線上的元素外,其它的元素是負的均方誤差作爲兩個數據間的相似值。計算公式如下:
c(i,j)=XiXy2 c(i, j) = -||X_i-X_y||^2
以Alice和Bob爲例,兩者間的相似性計算過程如下:
(34)2+(43)2+(35)2+(21)2+(11)2=7 (3-4)^2+(4-3)^2+(3-5)^2+(2-1)^2+(1-1)^2 = 7
因此,Alice與Bob之間的相似值爲-7。

相似性值的計算邊界出現在Bob和Edna間:
(41)2+(31)2+(53)2+(12)2+(13)2=22 (4-1)^2+(3-1)^2+(5-3)^2+(1-2)^2+(1-3)^2 = 22
Bob和Edna之間的相似值爲-22。

通過逐步的計算,最後得到的結果如下:

在這裏插入圖片描述

一般對角線上的元素取相似值中較小的數,在本例中取值爲-22,因此,得到的相似性矩陣如下:

在這裏插入圖片描述

Responsibility Matrix ®

這裏的responsibility matrix 是中間的過度步驟。通過使用如下的公式計算responsibility matrix:
r(i,k)s(i,k)maxksuch that k k{a(i,k)+s(i,k)}, r(i, k ) \leftarrow s(i, k)- max_{k^{'} such\ that\ k^{'} \not= \ k} \{a(i, k^{'})+s(i, k^{'})\},
其中,i表示協同矩陣的行,k表示列的關聯矩陣。

例如,r(Alice,Bob)r(Alice, Bob)的值爲-1, 首先提取similarity matrix中c(Alice,Bob)c(Alice, Bob)的值爲-7, 減去similarity matrix中Alice行的最大值爲-6,因此,得到r(Alice,Bob)=1r(Alice, Bob)=-1

取值的邊界爲r(Cary,Doug)r(Cary, Doug),其計算如下:

在這裏插入圖片描述
r(Cary,Doug)=18(6)=12 r(Cary, Doug) = -18-(-6)=-12

根據上述公式計算得到的最終結果如下圖所示:

在這裏插入圖片描述

Availability Matrix (a)

Availability Matrix的初始值爲矩陣中的所有元素均爲0。

首先,計算對角線上的元素值:
a(k,k)isuch that ikmax{0,r{i,k}}, a(k,k) \leftarrow \sum_{i^{'}such \ that \ i^{'} \not= k} max\{0, r\{i^{'}, k\}\},
其中,i表示協同矩陣的行,k表示協同矩陣的列。

實際上,上面的公式只告訴你沿着列,計算所有行與0比較的最大值(除列序與行序相等時的情況除外)。例如,a(Alice,Alice)a(Alice, Alice)的計算如下:
a(Alice,Alice)=10+11+0+0=21 a(Alice, Alice) = 10+11+0+0 = 21
其次,計算非對角線上的元素值,分別以a(Alice,Cary)a(Alice, Cary)a(Doug,Edna)a(Doug, Edna)爲例,其計算過程如下所示:

在這裏插入圖片描述
a(Alice,Cary)=1+0+0+0=1a(Doug,Edna)=0+0+0+9=9 a(Alice, Cary) = 1+0+0+0 = 1 \\ a(Doug, Edna) = 0+0+0+9 = 9
以下公式是用於更新Availability Matrix,其公式如下:
a(i,k)min{0,r(k,k)+isuch that i{i,k}max{0,r(i,k)}} a(i, k) \leftarrow min\{0, r(k,k)+\sum_{i^{'} such \ that \ i^{'} \notin \{i, k\}} max{\{0, r(i^{'}, k)}\}\}
當你想要更新a(Alice,Bob)a(Alice, Bob)的值時,其計算過程如下:
a(Doug,Bob)=min{0,(15)+0+0+0}=15 a(Doug, Bob) = min\{{0,(-15)+0+0+0}\}=-15
最後得到的結果如下表所示:

在這裏插入圖片描述

Criterion Matrix ©

在得到上面的availability matrix後,將availability matrix和responsibility matrix的對應元素相加,便可得到criterion matrix。

其計算公式如下:
c(i,k)r(i,k)+a(i,k). c(i, k) \leftarrow r(i,k)+a(i,k).
最後得到的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是一個無監督的機器學習算法,它尤其適用於那些不知道最佳聚類數情況的算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章