聚类算法 距离矩阵_模糊聚类算法
模糊聚類算法
1.如何理解模糊聚類
事物間的界線,有些是明確的,有些則是模糊的。當聚類涉及到事物之間的模糊界線時,需要運用模糊聚類分析方法。
如何理解模糊聚類的“模糊”呢:假設有兩個集合分別是A、B,有一成員a,傳統的分類概念a要么屬于A要么屬于B,在模糊聚類的概念中a可以0.3屬于A,0.7屬于B,這就是其中的“模糊”概念。
模糊聚類分析有兩種基本方法:系統聚類法和逐步聚類法。
系統聚類法個人理解類似于密度聚類算法,逐步聚類法類是中心點聚類法。(這里有不對的地方請指正)
逐步聚類法是一種基于模糊劃分的模糊聚類分析法。它是預先確定好待分類的樣本應分成幾類,然后按照最優原則進行在分類,經多次迭代直到分類比較合理為止。在分類過程中可認為某個樣本以某一隸屬度隸屬某一類,又以某一隸屬度隸屬于另一類。這樣,樣本就不是明確的屬于或不屬于某一類。若樣本集有n個樣本要分成c類,則他的模糊劃分矩陣為c×n。
該矩陣有如下特性:
2. 模糊C-means聚類算法
模糊c-均值聚類算法fuzzy c-means (FCM)。在眾多模糊聚類算法中,模糊C-均值(FCM)算法應用最廣泛且成功,它通過優化目標函數得到每個樣本點對所有類中心的隸屬度,從而對樣本進行自動分類。
2.1 FCM算法原理
假定我們有數據集X,我們要對X中的數據進行分類,如果把這些數據劃分成c個類的話,那么對應的就有c個類中心為Ci,每個樣本Xj屬于某一類Ci的隸屬度定為Uij,那么定義一個FCM目標函數及其約束條件如下:
目標函數(式1)由相應樣本的隸屬度與該樣本到各類中心的距離相乘組成的,式2為約束條件,也就是一個樣本屬于所有類的隸屬度之和要為 1 。式1中的m是一個隸屬度的因子,一般為2 ,||Xj - Ci|| 表示Xj到中心點Ci的歐式距離。目標函數J越小越好,說以我們要求得目標函數J的極小值,這里如何求極小值就不推導了。
Uij的迭代公式:
Ci的迭代公式:
我們發現Uij和Ci是相互關聯的,彼此包含對方,那么問題來了,fcm算法開始的時候既沒有Uij也沒有Ci,那么如何求解呢?很簡單,程序一開始的時候我們會隨機生成一個Uij,只要數值滿足條件即可,然后開始迭代,通過Uij計算出Ci,有了Ci又可以計算出Uij,反反復復,這個過程中目標函數J一直在變化,逐漸縐向穩定。那么當J不在變化時就認為算法收斂到一個較好的結果了。
2.2 FCM算法實現(python)
(1)算法流程
(2)代碼實現
import numpy as np
from sklearn import datasets
iris = datasets.load_iris()
print(iris.data.shape)
def FCM(X, c_clusters=3, m=2, eps=10):
membership_mat = np.random.random((len(X), c_clusters)) # 生成隨機二維數組shape(150,3),隨機初始化隸屬矩陣
# 這一步的操作是為了使Xi的隸屬度總和為1
membership_mat = np.divide(membership_mat, np.sum(membership_mat, axis=1)[:, np.newaxis])
while True:
working_membership_mat = membership_mat ** m # shape->(150,3)
# 根據公式計算聚類中心點Centroids.shape->(3,4)
Centroids = np.divide(np.dot(working_membership_mat.T, X), np.sum(working_membership_mat.T, axis=1)[:, np.newaxis])
# 該矩陣保存所有實點到每個聚類中心的歐式距離
n_c_distance_mat = np.zeros((len(X), c_clusters)) # shape->(150,3)
for i, x in enumerate(X):
for j, c in enumerate(Centroids):
n_c_distance_mat[i][j] = np.linalg.norm(x-c, 2) # 計算l2范數(歐氏距離)
new_membership_mat = np.zeros((len(X), c_clusters))
# 根據公式計算模糊矩陣U
for i, x in enumerate(X):
for j, c in enumerate(Centroids):
new_membership_mat[i][j] = 1. / np.sum((n_c_distance_mat[i][j] / n_c_distance_mat[i]) ** (2 / (m-1)))
if np.sum(abs(new_membership_mat - membership_mat)) < eps:
break
membership_mat = new_membership_mat
return np.argmax(new_membership_mat, axis=1)
print(FCM(iris.data))
代碼完全是根據上述流程和公式實現的,理解起來也很簡單,迭代退出條件可以優化一下,其他的可以不用改動。
(3)FCM的缺點
FCM是對J目標函數求極小值,也就是說我們得到的結果可能是目標函數的局部極值點或者是鞍點。
《來源于科技文獻,經本人分析整理,以技術會友,廣交天下朋友》
總結
以上是生活随笔為你收集整理的聚类算法 距离矩阵_模糊聚类算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 统计信号处理_声学前端:深度学习算法和传
- 下一篇: sketch 将动图转换为json_开源