前言:這幾天一直都在研究模糊聚類。感覺網上的文檔都沒有一個詳細而具體的講解,正好今天有時間,就來聊一聊模糊聚類。
一:模糊數學
我們大家都知道計算機其實只認識兩個數字0,1。我們平時寫程序其實也是這樣if 1 then do.永遠這種模式,在這種模式中,一個元素要么屬於這個集合,要么不屬於這個集合,但是對我們現在介紹的模糊集來說,某個元素可能部分屬於這個集合,又可能部分屬於另外的集合,顯然,例如,一個男人(1表示),一個女人(0表示),但是隨着科學技術的發展,出現了人妖這個生物(可能0.3屬於男人,0.7屬於女人).這樣如果用0,1就顯得不太恰當了,那我們該如何表示呢,且聽我慢慢道來。
開始之前先介紹模糊數學幾種不同的名稱:
模糊集:給定一個論域 U ,那么從 U 到單位區間 [0,1] 的一個映射稱為 U 上的一個模糊集,或 U 的一個模糊子集. 模糊集可以記為 A 。 映射(函數) μA(·) 或簡記為 A(·) 叫做模糊集 A 的隸屬函數。 對於每個 x ∈ U , μA(x) 叫做元素 x 對模糊集 A 的隸屬度。
模糊邏輯:它是一種相對於傳統是或者不是的二值邏輯而言的。例如下圖:,如果這個人在B里面,那么很好理解,人在B里面為1,但是如果出現下列這種情況呢:
,顯然用上述的邏輯就行不通了,但是可以這樣表示在(A,B)=(0,6,0.4),o,6在A, 0,4在B,這樣完美解決。其實拓展成3,4,5也都一樣。類似於,我們看周星馳的賭俠,反派用電腦分析,牌的可能性。其實跟這個道理差不多
模糊矩陣:設R=(rij)mxn,若0<=rij<=1,那么稱該矩陣為模糊矩陣。若矩陣元素只有0,1的時候成為布爾矩陣。如果對角線上都是一,則這個矩陣稱為自反矩陣、
模糊矩陣的關系以及並交與計算:
假設,
都是模糊矩陣。
交運算:
並運算:
余運算:
例子如下(畫的比較丑,請見諒):
模糊矩陣的合成:
設為模糊矩陣,
,為A與B的合成,其中
為模糊矩陣的冪。
定義:若A為n階方陣,定義:
首先模糊數學的基礎就補充到這里了。下面來看看。FCM算法。
二 FCM算法
2.1 FCM算法簡介
FCM算法首先是由E. Ruspini提出來的,后來J. C. Dunn與J. C. Bezdek將E. Ruspini算法從硬聚類算法推廣成模糊聚類算法。FCM算法是基於對目標函數的優化基礎上的一種數據聚類方法。聚類結果是每一個數據點對聚類中心的隸屬程度,該隸屬程度用一個數值來表示。FCM算法是一種無監督的模糊聚類方法,在算法實現過程中不需要人為的干預。這種算法的不足之處:首先,算法中需要設定一些參數,若參數的初始化選取的不合適,可能影響聚類結果的正確性;其次,當數據樣本集合較大並且特征數目較多時,算法的實時性不太好。
2.2 FCM算法的實現原理
我們的FCM算法是從硬划分而來的。
硬划分FCM算法的目標函數: 。U表示原矩陣,p表示聚類中心,dik表示樣本點xk與第i個類的樣本原型pi之間的失真度,一般是用兩個向量之間的距離表示。
軟划分FCM的目標函數:。Uik表示xk與第i類樣本的隸屬度。
一般性模糊聚類分析的目標函數: ,其中m>1.dik是一種距離范數,可以表示為
,A表示權重。
求解過程如下(把我以前寫的截圖發來):
得到:
求解聚類中心:
得到聚類中心:
FCM算法執行流程:
安利一波(百度腦圖,這是我認為百度做的比較有良心的東西了。我這個就是用百度腦圖畫的)
三 FCM的Matlab實現
function [U,P,Dist,Cluster_Res,Obj_Fcn,iter]=fuzzycm(Data,C,plotflag,M,epsm)
% 模糊 C 均值聚類 FCM: 從隨機初始化划分矩陣開始迭代
% [U,P,Dist,Cluster_Res,Obj_Fcn,iter] = fuzzycm(Data,C,plotflag,M,epsm)
% 輸入:
% Data: N×S 型矩陣,聚類的原始數據,即一組有限的觀測樣本集,
% Data 的每一行為一個觀測樣本的特征矢量,S 為特征矢量
% 的維數,N 為樣本點的個數
% C: 聚類數,1
% plotflag: 聚類結果 2D/3D 繪圖標記,0 表示不繪圖,為缺省值
% M: 加權指數,缺省值為 2
% epsm: FCM 算法的迭代停止閾值,缺省值為 1.0e-6
% 輸出:
% U: C×N 型矩陣,FCM 的划分矩陣
% P: C×S 型矩陣,FCM 的聚類中心,每一行對應一個聚類原型
% Dist: C×N 型矩陣,FCM 各聚類中心到各樣本點的距離,聚類中
% 心 i 到樣本點 j 的距離為 Dist(i,j)
% Cluster_Res: 聚類結果,共 C 行,每一行對應一類
% Obj_Fcn: 目標函數值
% iter: FCM 算法迭代次數
% See also: fuzzydist maxrowf fcmplot
if nargin<5
epsm=1.0e-6;
end
if nargin<4
M=2;
end
if nargin<3
plotflag=0;
end
[N,S]=size(Data);m=2/(M-1);iter=10000;
Dist(C,N)=0; U(C,N)=0; P(C,S)=0;
% 隨機初始化划分矩陣
U0 = rand(C,N);
U0=U0./(ones(C,1)*sum(U0));
% FCM 的迭代算法
while true
% 迭代計數器
iter=iter+1;
% 計算或更新聚類中心 P
Um=U0.^M;
P=Um*Data./(ones(S,1)*sum(Um'))';
% 更新划分矩陣 U
for i=1:C
for j=1:N
Dist(i,j)=fuzzydist(P(i,:),Data(j,:));
end
end
U=1./(Dist.^m.*(ones(C,1)*sum(Dist.^(-m))));
% 目標函數值: 類內加權平方誤差和
if nargout>4 | plotflag
Obj_Fcn(iter)=sum(sum(Um.*Dist.^2));
end
% FCM 算法迭代停止條件
if norm(U-U0,Inf) break
end
U0=U;
end
% 聚類結果
if nargout > 3
res = maxrowf(U);
for c = 1:
v = find(res==c);
Cluster_Res(c,1:length(v))=v;
end
end
% 繪圖
if plotflag
fcmplot(Data,U,P,Obj_Fcn);
end
我用的數據集聚類結果:
感覺效果好挺好的。
今天的模糊聚類就講到這里了希望大家點個關注,以及批評指正。