1. 程式人生 > >譜聚類演算法講解

譜聚類演算法講解

什麼是譜聚類?

聚類的直觀解釋是根據樣本間相似度,將它們分成不同組。譜聚類的思想是將樣本看作頂點,樣本間的相似度看作帶權的邊,從而將聚類問題轉為圖分割問題:找到一種圖分割的方法使得連線不同組的邊的權重儘可能低(這意味著組間相似度要儘可能低),組內的邊的權重儘可能高(這意味著組內相似度要儘可能高)。根據相似度將這些頂點連起來,最後進行分割。分割後還連在一起的頂點就是同一類了。

譜聚類演算法將聚類問題轉化為一個無向圖的多路劃分問題,資料點看成無向圖G(V,E)中的頂點V,加權邊的集合E={Sij}表示基於某一點相似性度量的兩點間的相似度,用S表示待聚類資料點之間的相似性矩陣,圖G中把聚類問題轉變為在圖

G上的圖劃分問題,即將圖G(V,E)劃分為K個互不相交的子集V,V,...Vk,劃分後每個子集V和V之間的相似程度較低,每個子集內部相似度較高。

記G=(V,E)表示一個無向加權圖,V表示所有頂點的集合V={v1,...,vn},E表示所有邊的集合,並且任意兩點vi和vj的邊具有非負權值wij≥0。圖的鄰接矩陣為W=(wij)i,j=1,...,n,如果wij=0則表示點vi和vj之間沒有連線。由於G為無向圖,所以其鄰接矩陣具有對稱性,即wij=wij。圖中任一點vi的度為di=∑nj=1wij,表示一個點與其他所有點的連線情況,圖的度矩陣D為每個點的度所構成的對角矩陣D=diag{d1,...,dn}。

以影象樣本資料為例:

譜聚類演算法將影象中的每個畫素看成一個無向圖的頂點,畫素與畫素之間的相似性看成是這個無向圖的邊,通過最優目標函式來分割這個無向圖。

譜聚類演算法還需要計算樣本點之間的相似度,計算相似度的公式成為距離公式,有所有樣本之間的相似度構成的矩陣,被稱為相似矩陣。

設某個提取的樣本為X,樣本點的個數為nn個頂點的無向完全圖),我們可以根據距離公式來計算出各點之間的相似度,距離公式一般有以下幾個:


在影象分割中,最常用的是歐式距離,不同的距離公式有自身的特點,可以得到不同的效果。

所有樣本之間的相似度構成的矩陣被稱為相似矩陣W,如下所示:


譜聚類的思想就是要轉化為圖分割問題。因此,第一步就是將原問題轉化為圖。轉為圖有兩個問題要解決:一是兩個頂點的邊要怎樣定義;二是要保留哪些邊。

     對於第一個問題,如果兩個點在一定程度上相似,就在兩個點之間新增一條邊。相似的程度由邊的權重表示。因此,只要是計算相似度的公式都可用。    

 要保留部分邊的原因有:邊太多了不好處理;權重太低的邊是多餘的。

樣本資料轉化成圖以後再求出樣本無向完全圖對應的矩陣,前面已經介紹了。接下來就是譜聚類中如何來處理矩陣模型(就是圖的劃分)

譜聚類中圖的劃分準則:

譜聚類演算法的思想來源於譜圖劃分,假定將每個資料樣本看作圖中的頂點V,根據樣本間的相似度將頂點間的邊E賦權重值W,這樣就得到一個基於樣本相似度的無項加權圖G=V,E)。那麼在圖G中就可將聚類問題轉化為在圖G上的圖劃分問題。

劃分的要求:

         子圖內部相似度高

         圖之間的相似度小。

對於聚類,關鍵的一步是要告訴計算機怎樣計算兩個資料點的“相似性”,不同的演算法需要的“相似性”是不一樣的。 例如給出了每個資料點的空間座標,我們就可以用資料點之間的歐式距離來判斷,距離越近,資料點可以認為越“相似”。當然,也可以用其它的度量方式,這跟所涉及的具體問題有關。

圖中一共有6個頂點,頂點之間的連線表示兩個頂點的相似度,現在要將這圖分成兩半(兩個類),要怎樣分割(去掉哪邊條)?根據譜聚類的思想,應該去掉的權值為0.1的邊和0.2的邊。最後,剩下的兩半就分別對應兩個類了。

聚類演算法關鍵就是對圖的劃分,那怎麼進行最優的劃分?

一般有以下幾種劃分準則:

1、最小割集準則

2、規範割集準則

3、比例割集準則

4、平均割集準則

5、最小最大割集準則

6、多路規範割集準則

最小割集準則:

譜圖理論中,將圖G劃分為AB兩個子圖的

代價函式為:

通過最小化上述剪下值來劃分圖G,這一劃分準則被稱為最小割集準則。用這個準則對一些影象進行分割,產生較好的效果,但是這個準則容易出現歪斜(即偏向小區域)分割。規範割集準則及比例割集準則均可避免這種情況的發生。

對上面的例圖做最小劃分後如下所示

如果我們想把一幅影象分割成K個子區域,那麼我們可以通過遞迴呼叫最小割集的方法來實現,但是這個影象的分割方法有一個弊端;最小割集準則容易分割出影象中的孤立點集合。如下圖所示:



劃分準則之間的比較



劃分準則有很多,那該怎樣選取一個最優的劃分?

對於圖的劃分就是要找到一個最優解,這樣我們便可以將問題轉化成求解相似矩陣或Laplacian矩陣的譜分解,譜聚類將圖劃分準則優化問題轉換成求解相似矩陣或者Laplacian矩陣特徵問題,可將此類方法統稱為譜聚類方法,也可以認為譜聚類方法是對圖劃分準則的逼近。

轉化成矩陣的模型後我們就要用到以下這些概念:相似矩陣、度矩陣、Laplacian矩陣

這裡我們要講到譜聚類中的關鍵內容——拉普拉斯矩陣,其定義為L=D–W,其中D和W就是上文定義的圖的度矩陣和鄰接矩陣。下面我們給出譜聚類中用到的拉普拉斯矩陣的一些性質。

下面我們一上面的圖為例來看看拉普拉斯矩陣。




拉普拉斯矩陣有兩種形式:規範化的拉普拉斯矩陣和非規範化的拉普拉斯矩陣


設有n個樣本點X,X,...X,由某個相似函式(可以用計算歐式距離的公式)Sij=S(X,X),Sij非負,相似矩陣為S=(Sijnxm

非規範譜聚類演算法


規範的譜聚類演算法:


上面兩個譜聚類演算法都用到拉普拉斯矩陣,那麼規範的拉普拉斯和非規範的拉普拉斯有什麼區別?

譜聚類的演算法都要計算拉普拉斯矩陣的特徵值和特徵向量,但是在實踐中規範的拉普拉斯矩陣在實際的聚類效果中更好,能夠獲得更好的聚類效能。

建立樣本模型和求拉普拉斯矩陣的實現(C++程式碼)

首先將對應的樣本轉化成完全圖並存在矩陣中:

doublesample[N][2];    //存放所有樣本點(2維的)

void readSample(char*filename){

    FILE *fp;

   if((fp=fopen(filename,"r"))==NULL){

        perror("fopen");

        exit(0);

    }

    char buf[50]={0};

    int i=0;

   while(fgets(buf,sizeof(buf),fp)!=NULL){         

        char *w=strtok(buf," \t");

        double x=atof(w);

        w=strtok(NULL," \t");

        double y=atof(w);

        sample[i][0]=x;

        sample[i][1]=y;

        i++;

        memset(buf,0x00,sizeof(buf));}

    assert(i==N);

    fclose(fp);

}

根據距離公式來計算出各點之間的相似度,計算拉普拉斯矩陣

double**getSimMatrix(){

    //為二維矩陣申請空間

    double **matrix=getMatrix(N,N);

    //計算樣本點兩兩之間的相似度,得到矩陣W

    int i,j;

    for(i=0;i<N;i++){

        matrix[i][i]=1;

        for(j=i+1;j<N;j++){

            doubledist=sqrt(pow(sample[i][0]-sample[j][0],2)+pow(sample[i][1]-sample[j][1],2));

            double sim=1.0/(1+dist);

            if(sim>T){

                matrix[j][i]=sim;

                matrix[i][j]=sim;

            }}}

    //計算L=D-W       求拉普拉斯矩陣

    for(j=0;j<N;j++){

        double sum=0;

        for(i=0;i<N;i++){

            sum+=matrix[i][j];  

            if(i!=j)

                matrix[i][j]=0-matrix[i][j];

        }

        matrix[j][j]=matrix[j][j]-sum;

    }

    return matrix;

}

譜聚類演算法的matlab實現(一個簡單的matlab的例項)

functionU=NJW(data,k)

%%NJW演算法 選取拉氏矩陣的前K個最大特徵值對應的特徵向量,使其在R(k)空間中構成與原資料一一對應的表述,並在該空間內進行聚類

%%data n*m n樣本個數  m 維度

%% k  選擇前k個最大特徵值對應的特徵向量

%計算相似矩陣

affinity =CalculateAffinity(data);

% 計算對角矩陣

D=eye(size(affinity,1));

fori=1:size(affinity,1)

    D(i,i) = sum(affinity(i,:));

end

%計算拉普拉斯矩陣,採用非規範化矩陣

% L=D-affinity;

% 規範化

fori=1:size(affinity,1)

    for j=1:size(affinity,2)

        L(i,j) = affinity(i,j) / (sqrt(D(i,i))* sqrt(D(j,j))); 

    end

end

%計算特徵值特徵向量

[eigVectors,eigValues]= eig(L);


譜聚類演算法的應用

譜聚類演算法是一種基於圖論的演算法,它在影象分割領域中應用非常廣泛,對於影象處理的步驟一般分為四步:1、將待分割的影象對映為無向帶權完全圖。2、計算圖對應的矩陣。3、求特徵值特徵向量。4、聚類。得出分割結果。演算法中相似度矩陣由圖中各畫素之間的相似度構成,在計算彩色影象畫素之間的相似度時,通常將影象的顏色特徵值與空間距離結合起來求出各畫素之間的相似度。

譜聚類演算法的不足

譜聚類演算法是基於譜圖理論的一類新的聚類演算法,能對任意形狀的資料樣本進行劃分,已經被成功應用到影象分割、影象識別(人臉識別)等領域。

但是譜聚類演算法自身也有不足的地方:演算法的時間複雜度和空間複雜度都是比較大的

影象分割中的缺點