FCM算法


1.模糊理論概述:

在我們的日常生活中有許多的事物,或多或少都具有模糊性和混淆不清的特性。“模模糊糊”的概念,是最微妙且難以捉摸,但卻又是常見最重要的,但在近代數學中卻有了很清晰的定義。 模糊理論的觀念在強調以模糊邏輯來描述現實生活中事物的等級,以彌補古典邏輯(二值邏輯)無法對不明確定義邊界事物描述的缺點。人類的自然語言在表達上具有很重的模糊性,難以“對或不對”、“好或不好”的二分法來完全描述真實的世界問題。故模糊理論將模糊概念,以模糊集合的定義,將事件(event)屬於這集合程度的歸屬函數(Membership grade),加以模糊定量化得到一歸屬度(Membership grade), 來處理各種問題。隨着科學的發展,研究對象越加復雜,而復雜的東西難以精確化,這是一一個突出的矛盾,也就是說復雜性越高,有意義的精確化能力越低,有意義性和精確性就變成兩個互相排斥的特性。而復雜性卻意味着因素眾多,以致使我們無法全部認真地去進行考察,而只抓住其中重要的部分,略去次要部分,但這有時會使本身明確的概念也會變得模糊起來,從而不得不采用“模糊的描述”

2模糊聚類:

事物間的界線,有些是明確的,有些則是模糊的。當聚類涉及到事物之間的模糊界線時,需要運用模糊聚類分析方法。
如何理解模糊聚類的“模糊”呢:假設有兩個集合分別是A、B,有一成員a,傳統的分類概念a要么屬於A要么屬於B,在模糊聚類的概念中a可以0.3屬於A,0.7屬於B,這就是其中的“模糊”概念。

模糊聚類分析有兩種基本方法:系統聚類法和逐步聚類法。

系統聚類法個人理解類似於密度聚類算法,逐步聚類法類是中心點聚類法。 

逐步聚類法是一種基於模糊划分的模糊聚類分析法。它是預先確定好待分類的樣本應分成幾類,然后按照最優原則進行在分類,經多次迭代直到分類比較合理為止。在分類過程中可認為某個樣本以某一隸屬度隸屬某一類,又以某一隸屬度隸屬於另一類。這樣,樣本就不是明確的屬於或不屬於某一類。若樣本集有n個樣本要分成c類,則他的模糊划分矩陣為c×n。
該矩陣有如下特性:
①. 每一樣本屬於各類的隸屬度之和為1。
②. 每一類模糊子集都不是空集。

3.FCM算法

3.1原理:

假定我們有數據集X,我們要對X中的數據進行分類,如果把這些數據划分成c個類的話,那么對應的就有c個類中心為Ci,每個樣本Xj屬於某一類Ci的隸屬度定為Uij,那么定義一個FCM目標函數及其約束條件如下:

 

目標函數(式1)由相應樣本的隸屬度與該樣本到各類中心的距離相乘組成的,式2為約束條件,也就是一個樣本屬於所有類的隸屬度之和要為 1 。
式1中的m是一個隸屬度的因子,一般為2 ,||Xj - Ci|| 表示Xj到中心點Ci的歐式距離。

 

我們發現Uij和Ci是相互關聯的,彼此包含對方 ,程序一開始 會隨機生成一個Uij,只要數值滿足條件即可,然后開始迭代,通過Uij計算出Ci,有了Ci又可以計算出Uij,反反復復,這個過程中目標函數J一直在變化,逐漸縐向穩定。那么當J不在變化時就認為算法收斂到一個較好的結果了。

3.2步驟:

(1)確定分類數,指數m的值,確定迭代次數 
(2)初始化一個隸屬度U(注意條件和為1);
(3)根據U計算聚類中心C;
(4)這個時候可以計算目標函數J了
(5)根據C返回去計算U,回到步驟3,一直循環直到結束。

舉栗子:

https://blog.csdn.net/in_nocence/article/details/78647305

大家可以參考一下

4.K-means算法和FCM均值的區別:

K-means算法:一種硬聚類算法,隸屬度只有兩個取值0或1,提出的基本根據是“類內誤差平方和最小化”准則;
FCM算法:一種模糊聚類算法,是k均值聚類算法的推廣形式,隸屬度取值為[0 1]區間內的任何一個數,提出的基本根據是“類內加權誤差平方和最小化”准則;
這兩個方法都是迭代求取最終的聚類划分,即聚類中心與隸屬度值。兩者都不能保證找到問題的最優解,都有可能收斂到局部極值,模糊c均值甚至可能是鞍點。
K均值和C均值,其實有種C是包含在K中的感覺,C只是特定的實現方式,K均值是廣義的概念。

5.實際應用:

煤炭為工業時代注入力量,即使到了發達的21世紀,我們的生活還是離不開煤炭,煤炭的種類也有很多,那如何將其分類呢?

通過查詢資料可知煤炭可以分為三類:無煙煤A1,煙煤A2,褐煤A3。設論域U為所有煤種的集合,則無煙煤A1,煙煤A2,和褐煤A3;是U上的模糊子集,  對於某一種給定的具體煤種u,試判斷u的歸屬問題。

(1)煤的特性指標

根據煤的化學成分和煤炭變量分析,我們選擇下列10個特性指標:炭(u),氫(u2), 全硫(u3), 氧(u4),鏡質分析(u5),絲質分析(u6), 塊狀微粒體(u7),粒狀微粒(u8),殼質體與樹脂體(u9),由鏡質組分測得的平均最大反射率(u10 ).因而每種煤的特性指標向量為u=(u1, u2,...... ,u10)

(2) 構造無煙煤A1,煙煤A 2和褐煤A 3的隸屬函數。

   1)在無煙煤A1中抽選6個煤樣: 
       ai=(ai1, ai2,..... ai10) (i=1,2...,6),
其中aij表示A1中第i個煤樣的第j個特性指標的實際測試數據

      在無煙煤A2中抽選12個煤樣: 
       bi=(bi1, bi2,..... bi10) (i=1,2...,12),
其中bij表示A2中第i個煤樣的第j個特性指標的實際測試數據

       在無煙煤A3中抽選6個煤樣: 
       ci=(ci1, ci2,..... ci10) (i=1,2...,6),
其中cij表示A3中第i個煤樣的第j個特性指標的實際測試數據

   2)計算所抽選的煤樣ai,bi,ci的平均值

       

   3)分別計算待識別煤樣u= {u1, u2,.... ,u10}與a,b,c之間的歐拉距離得:

     

   令D=d1(u, a)+d2(u, b)+d3(u,c),則可得無煙煤A1,煙煤A2和褐煤A3的隸屬函數是:

        A1(u)=1-d1(u, a)/D,   A2(u)=1-d2(u, b)/D,     A3(u)=1-d3(u, c)/D,

     把煤樣數據代入.上述式子得出個煤樣對無煙煤A1,煙煤A2和褐煤A3的隸屬度.

(3)按照最大隸屬原則判斷具體煤樣所應歸屬的煤炭類別.

數據部分樣本:

 

 

(4)matlab實現:

源代碼:

myfcm.m

function [U, V,objFcn] = myfcm(data, c, T, m, epsm)
% fuzzy c-means algorithm
% 輸入: data: 待聚類數據,n行s列,n為數據個數,s為每個數據的特征數
%        c  :  聚類中心個數
%        m  :   模糊系數
% 輸出: U  :   隸屬度矩陣,c行n列,元素uij表示第j個數據隸屬於第i類的程度
%        V  :  聚類中心向量,c行s列,有c個中心,每個中心有s維特征
% written by Zhang Jin
% see also  :  mydist.m  myplot.m

if nargin < 3
    T = 100;   %默認迭代次數為100
end
if nargin < 5
    epsm = 1.0e-6;  %默認收斂精度
end
if nargin < 4
    m = 2;   %默認模糊系數值為2
end

[n, s] = size(data);
% 初始化隸屬度矩陣U(0),並歸一化
U0 = rand(c, n);
temp = sum(U0,1);
for i=1:n
    U0(:,i) = U0(:,i)./temp(i);
end
iter = 0;
V(c,s) = 0; U(c,n) = 0; distance(c,n) = 0;

while( iter<T  )
    iter = iter + 1;
%    U =  U0;
    % 更新V(t)
    Um = U0.^m;
    V = Um*data./(sum(Um,2)*ones(1,s));   % 矩陣相乘  
    % 更新U(t)
    for i = 1:c
        for j = 1:n
            distance(i,j) = mydist(data(j,:),V(i,:));
        end
    end
    U=1./(distance.^m.*(ones(c,1)*sum(distance.^(-m))));
    objFcn(iter) = sum(sum(Um.*distance.^2));
    % FCM算法停止條件
    if norm(U-U0,Inf)<epsm  
        break
    end  
    U0=U;
end
myplot(U,objFcn);

距離函數:

function  d = mydist(X,Y)  

 d = sqrt(sum((X-Y).^2));

end

myplot.m

function myplot(U,objFcn)
% 將隸屬度U矩陣可視化

figure(1)
subplot(3,1,1);
plot(U(1,:),'-b');
title('隸屬度矩陣值')
ylabel('A1')
subplot(3,1,2);
plot(U(2,:),'-r');
ylabel('A2')
subplot(3,1,3);
plot(U(3,:),'-g');
xlabel('樣本數')
ylabel('A3')
figure(2)
grid on
plot(objFcn);
title('目標函數變化值');
xlabel('迭代次數')
ylabel('目標函數值')

結果:

由於數據收集樣本容量過小,且電腦安裝的matlab版本有些問題嘗試多次無法運行,之后會重新更新軟件用更多數據測試

但可推測迭代多次之后,目標函數開始收斂,從隸屬度矩陣上分析 ,三類煤有明顯的區分 。猜測不斷迭代后區分度會有所降低。

6.結論:

FCM算法的優缺點:

 優點:FCM方法會計算每個樣本對所有類的隸屬度,這給了我們一個參考該樣本分類結果可靠性的計算方法, 若某樣本對某類的隸屬度在所有類的隸屬度中具有絕對優勢,則該樣本分到這個類是一個十分保險的做法,反之若該樣本在所有類的隸屬度相對平均,則我們需要其他輔助手段來進行分類。

  缺點:算法在分類時有個主要的不足是,當樣本不平衡時,如一個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入一個新樣本時,該樣本的K個鄰居中大容量類的樣本占多數。 該算法只計算“最近的”鄰居樣本,某一類的樣本數量很大,那么或者這類樣本並不接近目標樣本,或者這類樣本很靠近目標樣本。無論怎樣,數量並不能影響運行結果。

 

參考文獻:

https://blog.csdn.net/HUXINY/article/details/90607216

   

 

        

 


           

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM