在k-means中,每個元素只能屬於所有類別中的一類。那這樣會帶來一些問題:
- 所有的元素對於計算聚類中心的貢獻都是相同的。
因為從根本上,對於屬於一個類的所有元素來說,在k-means中是無法將他們區別開的(如果非要用距離什么的來區分也可以,但是這部分功能不是k-mean擅長的)。而在fuzzy c-means中,元素可能屬於任何一類,不同的是它們之間的可能性是不同的。數學表示如下:
Jm = ΣΣuijm × |xi - ci|2
其中:
- xi:元素;
- cj:聚類中心;
- uij:元素xi對於聚類中心cj的隸屬度(屬於這個類的可能性);
- m:大於1的實數,一般取值2.0;
Jm用來評估聚類效果,Jm越大,聚類效果越差。那么聚類的過程其實就是找Jm的極小值的過程。其實從函數的角度看,Jm取得極小值時偏導數為0,也就是說uij和cj的變換都接近於0,而這里其實我們只需要考慮一個(比如在uij趨於不變時通常cj也趨於穩定),而這里選擇uij的原因是衡量起來簡單一點(取值范圍為[0,1],設置一個比較小的閥值即可)。
求極值是一個迭代的過程,更新聚類中心cj的方法與k-means非常相似,如下:
cj = (Σuijm × xi) / Σuijm
更新隸屬度uij的方法如下:
uij = 1 / (∑((|xi - cj|/|xi - ck|)2 / (m - 1)))
那么迭代結束的條件顯然是:
max{|uijk+1 - uijk|} < ε
這樣,fuzzy c-means的整體的過程如下:
- 初始化隸屬度矩陣;
- 計算聚類中心C;
- 更新隸屬度矩陣U;
- 如果max{|uijk+1 - uijk|} < ε或者迭代次數達到上限,結束迭代,否則轉2;
注:不管是k-means還是fuzzy c-means,有沒有感覺這個過程和迭代法求線性方程組的解的過程非常相似?其實有時候感覺這兩個過程本來就是相同的。
fuzzy c-means迭代式的推導
利用拉格朗日乘子法構造新的函數:
Jm = ΣΣuijm × |xi - ci|2 + λ × (Σuij - 1)
在Jm取得極值時滿足如下條件:
∂J / ∂λ = Σuij - 1 = 0
∂J / ∂uij = m × uijm-1 × |xi - cj|2 - λ = 0
∂J / ∂cj = Σuijm × xi - cj × Σuijm = 0
根據后面的兩條即可得到uij和cj的迭代式(想想在第二條中如何消掉λ?提示:利用∑uij = 1)。
----- -- -
end