1. 程式人生 > >模糊C均值聚類演算法的實現

模糊C均值聚類演算法的實現



模糊C均值聚類演算法的實現

研究背景

聚類分析是多元統計分析的一種,也是無監督模式識別的一個重要分支,在模式分類 影象處理和模糊規則處理等眾多領域中獲得最廣泛的應用。它把一個沒有類別標記的樣本按照某種準則劃分為若干子集,使相似的樣本儘可能歸於一類,而把不相似的樣本劃分到不同的類中。硬聚類把每個待識別的物件嚴格的劃分某類中,具有非此即彼的性質,而模糊聚類建立了樣本對類別的不確定描述,更能客觀的反應客觀世界,從而成為聚類分析的主流。

模糊聚類演算法是一種基於函式最優方法的聚類演算法,使用微積分計算技術求最優代價函式,在基於概率演算法的聚類方法中將使用概率密度函式,為此要假定合適的模型,模糊聚類演算法的向量可以同時屬於多個聚類,從而擺脫上述問題。

模糊聚類分析演算法大致可分為三類

1)分類數不定,根據不同要求對事物進行動態聚類,此類方法是基於模糊等價矩陣聚類的,稱為模糊等價矩陣動態聚類分析法。

2)分類數給定,尋找出對事物的最佳分析方案,此類方法是基於目標函式聚類的,稱為模糊C均值聚類。

3)在攝動有意義的情況下,根據模糊相似矩陣聚類,此類方法稱為基於攝動的模糊聚類分析法

我所學習的是模糊C均值聚類演算法,要學習模糊C均值聚類演算法要先了解慮屬度的含義,隸屬度函式是表示一個物件x隸屬於集合A的程度的函式,通常記做μA(x),其自變數範圍是所有可能屬於集合A的物件(即集合A所在空間中的所有點),取值範圍是[0,1]

,即0<=μA(x)<=1。μA(x)=1表示x完全隸屬於集合A,相當於傳統集合概念上的xA。一個定義在空間X={x}上的隸屬度函式就定義了一個模糊集合A,或者叫定義在論域X={x}上的模糊子集。對於有限個物件x1x2,……,xn模糊集合可以表示為:

(6.1)

有了模糊集合的概念,一個元素隸屬於模糊集合就不是硬性的了,在聚類的問題中,可以把聚類生成的簇看成模糊集合,因此,每個樣本點隸屬於簇的隸屬度就是[01]區間裡面的值。

FCM演算法需要兩個引數一個是聚類數目C,另一個是引數m。一般來講C要遠遠小於聚類樣本的總個數,同時要保證C>1。對於m,它是一個控制演算法的柔性的引數,如果m

過大,則聚類效果會很次,而如果m過小則演算法會接近HCM聚類演算法。

演算法的輸出是C個聚類中心點向量和C*N的一個模糊劃分矩陣,這個矩陣表示的是每個樣本點屬於每個類的隸屬度。根據這個劃分矩陣按照模糊集合中的最大隸屬原則就能夠確定每個樣本點歸為哪個類。聚類中心表示的是每個類的平均特徵,可以認為是這個類的代表點。

從演算法的推導過程中我們不難看出,演算法對於滿足正態分佈的資料聚類效果會很好,另外,演算法對孤立點是敏感的。

聚類演算法是一種比較新的技術,基於曾次的聚類演算法文獻中最早出現的Single-Linkage層次聚類演算法是1957年在Lloyd的文章中最早出現的,之後MacQueen獨立提出了經典的模糊C均值聚類演算法,FCM演算法中模糊劃分的概念最早起源於Ruspini的文章中,但關於FCM的演算法的詳細的分析與改進則是由DunnBezdek完成的。

模糊c均值聚類演算法因演算法簡單收斂速度快且能處理大資料集,解決問題範圍廣,易於應用計算機實現等特點受到了越來越多人的關注,並應用於各個領域。

演算法描述

模糊C均值聚類演算法的步驟還是比較簡單的,模糊C均值聚類(FCM),即眾所周知的模糊ISODATA,是用隸屬度確定每個資料點屬於某個聚類的程度的一種聚類演算法。1973年,Bezdek提出了該演算法,作為早期硬C均值聚類(HCM)方法的一種改進。

FCMn個向量xii=1,2,…,n)分為c個模糊組,並求每組的聚類中心,使得非相似性指標的價值函式達到最小。FCMHCM的主要區別在於FCM用模糊劃分,使得每個給定資料點用值在01間的隸屬度來確定其屬於各個組的程度。與引入模糊劃分相適應,隸屬矩陣U允許有取值在01間的元素。不過,加上歸一化規定,一個數據集的隸屬度的和總等於1

(6.9)

那麼,FCM的價值函式(或目標函式)就是式(6.2)的一般化形式:

(6.10)

這裡uij介於01間;ci為模糊組I的聚類中心,dij=||ci-xj||為第I個聚類中心與第j個數據點間的歐幾里德距離;且是一個加權指數。

構造如下新的目標函式,可求得使(6.10)式達到最小值的必要條件:

(6.11)

這裡ljj=1n,是(6.9)式的n個約束式的拉格朗日乘子。對所有輸入參量求導,使式(6.10)達到最小的必要條件為:

(6.12)

(6.13)

由上述兩個必要條件,模糊C均值聚類演算法是一個簡單的迭代過程。在批處理方式執行時,FCM用下列步驟確定聚類中心ci和隸屬矩陣U[1]

步驟1:用值在01間的隨機數初始化隸屬矩陣U,使其滿足式(6.9)中的約束條件

步驟2:用式(6.12)計算c個聚類中心cii=1,…,c

步驟3:根據式(6.10)計算價值函式。如果它小於某個確定的閥值,或它相對上次價值函式值的改變數小於某個閥值,則演算法停止。

步驟4:用(6.13)計算新的U矩陣。返回步驟2

上述演算法也可以先初始化聚類中心,然後再執行迭代過程。由於不能確保FCM收斂於一個最優解。演算法的效能依賴於初始聚類中心。因此,我們要麼用另外的快速演算法確定初始聚類中心,要麼每次用不同的初始聚類中心啟動該演算法,多次執行FCM

模糊c均值聚類演算法如下:

Reapeat for l=12 3……..

Step 1:computethe cluseter prototypes(means):

Step 2:competethe distance:

Step 3:Updatethe partition matrix:

演算法改進

  1. 在模糊聚類的目標函式中Bezdek引入了加權指數m,使Dum的聚類準則變成m=2時候的特例,從數學上說m的出現不自然且沒有必要,但如果不給以慮屬度乘以權值,那麼從硬聚類準則函式到軟聚類目標函式的推廣準則是無效的,引數m又稱為平滑因子,控制著模式早模糊類間的分享程度,因此,要實現模糊c聚類就要選擇一適合的m,然而最佳的m的選取目前還缺乏理論,監管存在一些經驗值或經驗範圍,但沒有面向問題的優選方法,也缺少引數m的有效性評價準則

  2. 儘管模糊聚類是一種無監督的分類,但現在的聚類演算法卻=需要應用聚類原型的先驗條件,否則演算法會產生誤導,從未破壞演算法的無監督性和自動化。

  3. 因為模糊聚類目標是非凸的,而模糊C均值聚類演算法的計算過程又是迭代爬山,一次很容易陷入區域性極值點,從而得不到最優解或滿意解,同時,大資料量下演算法耗時也是困擾人們的一大難題,這2個問題目前還不能得到全面的解決。

  4. FCM型別的聚類演算法屬於劃份方法,對於1組給定的樣本集,不管資料中有無聚類結構,也不問分類結果是否有效,總把資料劃分到C個子類中,換言之,現有的聚類分析與聚類趨勢,以及有效分析是隔離的分離得。

  5. FCM的聚類演算法是針對特徵空間中的點集設計的,對於特殊型別的資料,比如在樣本每維特徵的賦值不是一個數,而是一個區間。集合和模糊數時,FCM型別的演算法無法直接處理

    模糊C均值聚類演算法存在上述缺點,改進的演算法正確率能達到更高。Fcm演算法在處理小資料集的時候是有效的,但隨著資料容量和維數的增加,迭代步驟會顯著增加,而且在迭代的每一步都要對整個資料集進行操作,無法滿足資料探勘時的需要。

    改進演算法的思想是首先採用隨機抽樣的辦法,從資料集中選取多個樣本,對每個樣本應用FCM演算法,將得到的結果作為初始群體,然後再利用遺傳演算法對聚類結果進行優化,選取其中的最優解做為問題的輸出,由於取樣技術顯著的壓縮了問題的規模,而遺傳又可以對結果進行全域性最優化處理,因此在時間效能和聚類質量上都能獲得較滿意的結果。

    遺傳演算法是美國Michigon大學的John Holland研究機器學習時創立的一種新型的優化演算法,它的主要優點是:遺傳演算法是從一系列點的群體開始搜尋而不是從單個樣本點進行搜尋,遺傳演算法利用適應值的相關資訊,無需連續可導或其他輔助資訊,遺傳演算法利用轉移概率規則,而非確定性規則進行迭代,遺傳演算法搜尋過程中,以對群體進行分化以實現並行運算,遺傳演算法經過遺傳變異和雜交運算元的作用,以保證演算法以概率1收斂到全域性最優解具有較好的全域性特性,其次遺傳算法佔用計算機的記憶體小,尤其適用計算複雜的非線性問題。

    遺傳演算法的設計部分

  1. 種群中個體的確定

    聚類的關鍵問題是聚類中心的確定,因此可以選取聚類中心作為種群的個體,由於共有C個聚類中心,而每個聚類中心是一個S維的實數向量,因此每個個體的初始值是一個c*s維的市屬向量。

  2. 編碼

    常用的編碼方式有二進位制與實數編碼,由於二進位制編碼的方式搜尋能力最強,且交叉變異操作簡單高效,因此採用二進位制的編碼方式,同時防止在進行交叉操作時對優良個體造成較大的破壞,在二進位制編碼的方式中採用格雷碼的編碼形式。

    每個染色體含c*s個基因鏈,每個基因鏈代表一維的資料,由於原始資料中各個屬性的取值可能相差很大,因此需首先對資料進行交換以統一基因鏈的長度,可以有以下兩種變換方式。

    1掃描整個資料集,確定每維資料的取值範圍,然後將其變換到同一量級,在保留一定有效位的基礎上取整,根據有效位的個數動態的計算出基因鏈的長度。

    2對資料進行正規化處理,即將各維資料都變換到相同的區間,可以算出此時的基因鏈長度為10

  3. 適應度函式

    由於在演算法中只使用了聚類中心V,而未使用慮屬矩陣u,因此需要對FCM聚類演算法的目標函式進行改進,以適用演算法的要求,和目標函式是等價的,由於遺傳演算法的適用度一般取值極大,因此可取上式的倒數作為演算法的使用度函式。

  4. 初始種群的確定

    初始種群的一般個體由通過取樣後執行FCM演算法得到的結果給出,另外的一般個體通過隨機指定的方法給出,這樣既保證了遺傳演算法在運算之初就利用背景知識對初始群體的個體進行了優化,使演算法能在一個較好的基礎上進行,又使得個體不至於過分集中在某一取值空間,保證了種群的多樣性。

  5. 遺傳操作

    選擇操作採用保持最優的錦標賽法,錦標賽規模為2,即每次隨機取2個個體,比較其適應度,較大的作為父個體,並保留每代的最優個體作為下一代,交叉方式一般採用單點交叉或多點交叉法進行,經過試驗表明單點交叉效果較好,因此採用單點交叉法,同時在交叉操作中,應該對每維資料分開進行,以保證較大的搜尋空間和結果的有效性,變異操作採用基本位變異法。

  6. 終止條件的確定

    遺傳演算法在以下二種情況下終止

    a最佳個體保持不變的代數達到設定的閾值

    b遺傳操作以到達給定的最大世代數

    演算法具體步驟如下

    1確定引數,如聚類個數 樣本集大小 種群規模 最大世代數 交叉概率和變異概率等。

    2對資料集進行多次取樣並執行FCM演算法,得到初始種群的一般個體,通過隨機制定產生另一半個體。

    3對資料集進行正規化處理並編碼。

    4計算初始種群中個體的適應度。

    5對種群進行遺傳操作產生下一代,在操作的過程中,應該排除產生的無效個體。

    6計算個體的適應度,如果滿足終止條件,則演算法結束,否則轉到5繼續

    在理論上講進行遺傳操作的樣本容量越大,聚類的誤差越小,由於取樣技術顯著壓縮了問題規模,而遺傳演算法又可以對全域性進行最優化處理,因此改進的演算法在時間與效能上都能獲得較滿意的結果,此演算法利用取樣技術來提高演算法的執行速度,利用遺傳演算法對聚類進行優化,避免陷入區域性最優解,在效能上相比於傳統的模糊C均值聚類演算法獲得較大提高。

    演算法實現

    ·採用VC++進行編寫

    文件的讀取

    #include "data.h"

    //函式定義

    double **DataRead(char*name,int row,intcol)

    {

    double**p=new double* [row];

    ifstreaminfile;

    infile.open(name,ios::in);

    for(inti=0;i<row;i++)

    {

    p[i]=newdouble[col];

    for(intj=0;j<col;j++)

    {

    infile>>p[i][j];

    }

    }

    infile.close();

    cout<<"成功讀取資料檔案:"<<name<<"!\n";

    returnp;

    //釋放記憶體

    for(i=0;i<row;i++)

    {

    delete[]p[i];

    }

    delete[]p;

    }

    文件的儲存

    #include "data.h"

    void DataSave(double**data,int row,intcol,char*name)

    {

    inti,j;

    ofstreamoutfile;

    //開啟檔案,輸出資料

    outfile.open(name,ios::out);

    outfile.setf(ios::fixed);

    outfile.precision(4);

    for(i=0;i<row;i++)

    {

    for(j=0;j<col;j++)

    {

    outfile<<data[i][j]<<"";

    }

    outfile<<endl;

    }

    outfile<<endl<<endl;

    outfile.close();

    }

    資料標準化處理

    #include "data.h"

    double **Standardize(double **data,introw,int col)

    {

    inti,j;

    double*a=new double[col];//矩陣每列的最大值

    double*b=new double[col];//矩陣每列的最小值

    double*c=new double[row];//矩陣列元素

    for(i=0;i<col;i++)

    {

    //取出資料矩陣的各列元素

    for(j=0;j<row;j++)

    {

    c[j]=Data[j][i];

    }

    a[i]=c[0],b[i]=c[0];

    for(j=0;j<row;j++)

    {

    //取出該列的最大值

    if(c[j]>a[i])

    {

    a[i]=c[j];

    }

    //取出該列的最小值

    if(c[j]<b[i])

    {

    b[i]=c[j];

    }

    }

    }

    //資料標準化

    for(i=0;i<row;i++)

    {

    for(j=0;j<col;j++)

    {

    data[i][j]=(data[i][j]-b[j])/(a[j]-b[j]);

    }

    }

    cout<<"完成資料極差標準化處理!\n";

    delete[]a;

    delete[]b;

    delete[]c;

    returndata;

    }

    生成樣本慮屬矩陣

    #include "data.h"

    void Initialize(double **u, int k, introw)

    {

    inti,j;

    //初始化樣本隸屬度矩陣

    srand(time(0));

    for(i=0;i<k;i++)

    {

    for(j=0;j<row;j++)

    {

    u[i][j]=(double)rand()/RAND_MAX;//得到一個小於1的小數隸屬度

    }//rand()函式返回0RAND_MAX之間的一個偽隨機數

    }

    }

    資料歸一化處理

    #include "data.h"

    void Normalize(double **u,int k,intcol)

    {

    inti,j;

    double*sum=new double[col];

    相關推薦

    模糊C均值演算法實現

    模糊C均值聚類演算法的實現 研究背景 https://blog.csdn.net/liu_xiao_cheng/article/details/50471981    聚類分析是多元統計分析的一種,也是無監督模式識別的一個重要分支,在模式分類 影象處理和模糊

    模糊C均值演算法實現

     模糊C均值聚類演算法的實現 研究背景 聚類分析是多元統計分析的一種,也是無監督模式識別的一個重要分支,在模式分類 影象處理和模糊規則處理等眾多領域中獲得最廣泛的應用。它把一個沒有類別標記的樣本按照某種準則劃分為若干子集,使相似的樣本

    FCM 模糊C均值演算法

    首先FCM在影象分割領域有很多應用,FCM演算法我覺得主要是兩個部分,一個是模糊理論,一個是C/Kmean演算法,這兩者在數學家手中完美的結合。 下面切入整體,我也是為了溫故才寫的這篇部落格,如有錯誤或者瑕疵的地方歡迎指出。話說有一個集合,甭管是啥,但是如果你是影象分割的話

    模糊C均值演算法

    The Algorithm Fuzzy c-means (FCM) is a method of clustering which allows one piece of data to belong to two or more clusters. This method

    機器學習演算法原理總結系列---演算法基礎之(13)模糊C均值(Fuzzy C-means Clustering)

    筆者在韓國Chonnam National University攻讀碩士學位,FCM演算法是professer Lim在這學期主要授課的內容,他說他剛發一篇FCM結合遺傳演算法還有各種腦電訊號處理,搭建分析AD病人的EEG訊號的計算智慧模型。反正就是各種難

    模糊C均值以及C實現

    1. 基本介紹     同K均值類似,FCM演算法也是一種基於劃分的聚類演算法,它的思想就是使得被劃分到同一簇的物件之間相似度最大,而不同簇之間的相似度最小。     模糊C均值是普通C均值聚類演算法的改進,普通C均值對資料進行硬性劃分,一個樣本一定明確的屬於某一類,FC

    模糊C均值(FCM)演算法

    本程式碼演算法用例為鳶尾花資料集合;IOSDATA演算法實現步驟,在很多資料和論壇中都有詳細的介紹,這裡就不對演算法步驟進行陳述了。就我程式碼中,我對下面幾個控制引數的理解:初始聚類數:初始類聚中心,跟聚類聚中心劃分簇。期望得到的聚類數:這個數並不是最終得到的類聚數目,可以理

    k-means(k均值)演算法介紹及實現(c++)

    基本介紹: k-means 演算法接受輸入量 k ;然後將n個數據物件劃分為 k個聚類以便使得所獲得的聚類滿足:同一聚類中的物件相似度較高;而不同聚類中的物件相似度較小。聚類相似度是利用各聚類中物件的均值所獲得一個“中心物件”(引力中心)來進行計算的。 工作過程:   k

    K-means均值演算法的原理與實現

    轉自:http://blog.csdn.net/xiaolewennofollow/article/details/45541159 K-均值聚類演算法的原理與實現 聚類是一種無監督的學習,它將相似的物件歸到同一個簇中,聚類方法幾乎可以應用於所有物件,簇內的物件越相似,聚類的效果越好,本文主要介紹K-均值聚

    K均值演算法的MATLAB實現

    單來說,K-均值聚類就是在給定了一組樣本(x1, x2, ...xn) (xi, i = 1, 2, ... n均是向量) 之後,假設要將其聚為 m(<n) 類,可以按照如下的步驟實現:   Step 1: 從 (x1, x2, ...xn) 中隨機選擇

    【機器學習】:Kmeans均值演算法原理(附帶Python程式碼實現)

    這個演算法中文名為k均值聚類演算法,首先我們在二維的特殊條件下討論其實現的過程,方便大家理解。 第一步.隨機生成質心 由於這是一個無監督學習的演算法,因此我們首先在一個二維的座標軸下隨機給定一堆點,並隨即給定兩個質心,我們這個演算法的目的就是將這一堆點根據它們自身的座標特徵分為兩類,因此選取了兩個質心,什麼時

    機器學習實戰(Machine Learning in Action)學習筆記————06.k-均值演算法(kMeans)學習筆記

    機器學習實戰(Machine Learning in Action)學習筆記————06.k-均值聚類演算法(kMeans)學習筆記關鍵字:k-均值、kMeans、聚類、非監督學習作者:米倉山下時間:2018-11-3機器學習實戰(Machine Learning in Action,@author: Pet

    在Ignite中使用k-均值演算法

    在本系列前面的文章中,簡單介紹了一下Ignite的k-最近鄰(k-NN)分類演算法,下面會嘗試另一個機器學習演算法,即使用泰坦尼克資料集介紹k-均值聚類演算法。正好,Kaggle提供了CSV格式的資料集,而要分析的是兩個分類:即乘客是否倖存。 為了將資料轉換為Ignite支援的格式,前期需要做一些清理和格式化

    k-均值 演算法

      首先初始化k個點作為質心,遍歷資料集,把每一個數據點分配到距離最近的質心,把這個質心下的所有點的均值作為新的質心,迭代更新。   度量聚類效果的指標:SSE( sum of squared error)誤差平方和 改進演算法:二分-k-均值演算法(克服k-均值區

    機器學習實戰———k均值 演算法

    問題:關於第九章list()新增的問題 fltLine = list(map(float,curLine)) fltLine = map(float,curLine) 二者的區別在於 加list()輸出為數 [1.658985, 4.285136] [-3.453

    機器學習實戰---讀書筆記: 第10章 利用K均值演算法對未標註資料分組---1

    #!/usr/bin/env python # encoding: utf-8 import os from matplotlib import pyplot as plt from numpy import * ''' 讀書筆記之--<<機器學習實戰>>--第10章_

    機器學習 (Clustering)____K-均值演算法(K-means Clustering) 層次(Hierarchical Clustering)

    ____tz_zs學習筆記聚類(Clustering) 顧名思義,就是將相似樣本聚合在一起,屬於機器學習中的非監督學習 (unsupervised learning) 問題。聚類的目標是找到相近的資料點,並將相近的資料點聚合在一起。實現聚類的演算法主要有:1.K-均值聚類演算

    《機器學習實戰》KMeans均值演算法

    一、引言聚類是一種無監督學習,對一些沒有標籤的資料進行分類。二、K均值聚類演算法2.1 演算法過程:隨機確定K個初始點為質心(簇個數k由使用者給定),計算資料集中每個點到每個質心的距離本次採用的是歐式距離,然後將資料集中的每個點尋找距其最近的質心,分配到對應的簇中完成後,每個

    K-means(K-均值)演算法

    劃分方法 聚類分析最簡單、最基本的版本是劃分,它把物件組織成多個互斥的簇。這一方法,要求每個物件必須/恰好屬於每一個簇。(事實上,我們應該知道,這個要求是很不合理的,因為它忽略了離群點,假若把噪聲資料強行劃分在簇裡,那勢必會降低聚類的準確率,所以為了改進這一點

    【opencv學習之四十三】K均值演算法

    K均值聚類演算法,在opencv中通過kmeans()函式實現;k均值通俗講:就是從一堆樣本中,隨便挑出幾個,比如3個吧,然後用樣本中的和這挑出來的比較,比較後排序,誰和挑出的那個接近就把他劃到那個類裡,比如樣A和挑1、挑2、挑3中,挑2最接近,則把樣A劃到挑2裡,當然還沒完