1. 程式人生 > >【轉載】譜聚類(spectral clustering)

【轉載】譜聚類(spectral clustering)

1. 譜聚類

      給你部落格園上若干個部落格,讓你將它們分成K類,你會怎樣做?想必有很多方法,本文要介紹的是其中的一種——譜聚類。
      聚類的直觀解釋是根據樣本間相似度,將它們分成不同組。譜聚類的思想是將樣本看作頂點,樣本間的相似度看作帶權的邊,從而將聚類問題轉為圖分割問題:找到一種圖分割的方法使得連線不同組的邊的權重儘可能低(這意味著組間相似度要儘可能低),組內的邊的權重儘可能高(這意味著組內相似度要儘可能高)。將上面的例子代入就是將每一個部落格當作圖上的一個頂點,然後根據相似度將這些頂點連起來,最後進行分割。分割後還連在一起的頂點就是同一類了。更具體的例子如下圖所示:

在上圖中,一共有6個頂點(部落格),頂點之間的連線表示兩個頂點的相似度,現在要將這圖分成兩半(兩個類),要怎樣分割(去掉哪邊條)?根據譜聚類的思想,應該去掉的邊是用虛線表示的那條。最後,剩下的兩半就分別對應兩個類了。
      根據這個思想,可以得到unnormalized譜聚類和normalized譜聚類,由於前者比後者簡單,所以本文介紹unnormalized譜聚類的幾個步驟(假設要分K個類):
(a)建立similarity graph,並用 W 表示similarity graph的帶權鄰接矩陣
(b)計算unnormalized graph Laplacian matrix L(L = D - W, 其中D是degree matrix)
(c)計算L的前K個最小的特徵向量
(d)把這k個特徵向量排列在一起組成一個N*k的矩陣,將其中每一行看作k維空間中的一個向量,並使用 K-means 演算法進行聚類

2. 演算法原理解析

     這一節主要從大體上解釋unnormalized譜聚類的四個步驟是怎麼來的,不涉及具體的公式推導。
(a)譜聚類的思想就是要轉化為圖分割問題。因此,第一步就是將原問題轉化為圖。轉為圖有兩個問題要解決:一是兩個頂點的邊要怎樣定義;二是要保留哪些邊。
      對於第一個問題,如果兩個點在一定程度上相似,就在兩個點之間新增一條邊。相似的程度由邊的權重表示(上圖中邊上面的數值就是權重了)。因此,只要是計算相似度的公式都可用,不過常用的是Gaussian similarity function
      要保留部分邊的原因有:邊太多了不好處理;權重太低的邊是多餘的。常用的保留邊的方法是建立k-nearest neighbor graph。在這種圖中,每個頂點只與K個相似度最高的點連邊。

(b)unnormalized graph Laplacian matrix(以下用L表示)有很多很好的性質,也正是這個原因,才要在第二步中計算這麼一個矩陣。最重要的性質是下面這一組性質:

這一組性質將在之後的公式推導中起到決定性作用。

(c)將原問題轉化為圖後,接下來的工作就是決定怎樣分割了。圖分割問題實際上就是最小割問題(mincut problem)。最小割問題可定義為最小化以下目標函式:

其中k表示分成k個組,Ai表示第i個組,表示第Ai的補集,W(A,B)表示第A組與第B組之間的所有邊的權重之和。
      這個式子的直觀意義:如果要分成K個組,那麼其代價就是進行分割時去掉的邊的權重的總和。可惜的是直接最小化這式子通常會導致不好的分割。以分成2類為例,這個式子通常會將圖分成這樣的兩類:一個點為一類,剩下的所有點為另一類。顯然,這樣的分割是很不好的。因為我們期望著每個類都有合理的大小。所以,要對這個式子進行改進,改進後的公式(稱為RatioCut)如下:

其中|A|表示A組中包含的頂點數目。
      在RatioCut中,如果某一組包含的頂點數越少,那麼它的值就越大。在一個最小化問題中,這相當於是懲罰,也就是不鼓勵將組分得太小。現在只要將最小化RatioCut解出來,分割就完成了。不幸的是,這是個NP難問題。想要在多項式時間內解出來,就要對這個問題作一個轉化了。在轉化的過程中,就用到上面提到的L的那一組性質,經過若干推導,最後可以得到這樣的一個問題:


其中H是一個矩陣,它的元素的定義(Eq.(5))如下:

      如果H矩陣的元素不為0,則說明第i個點屬於第j個類。也就是說,只要得到H矩陣,就能知道要怎樣分割了。可惜的是,這個問題仍然是NP難問題。但是,如果我們讓H矩陣的元素能夠取任意值,這個問題就變成多項式時間內可解的了,此時問題變為:


      根據Rayleigh-Ritz theorem,這個問題的解是L的前k個最小的特徵向量組成的矩陣H,其中特徵向量是按列來排,即H的每一列,均為一個特徵向量。

(d)在第三步中,我們為了鬆馳NP難問題,讓H矩陣取任意值,因此,解出來的H矩陣不再具有原來的性質——元素值能指出哪個點屬於哪一類。儘管如此,對於k-means來說,將H矩陣的每一行當作一個點進行聚類還是挺輕鬆的。因此,用k-means對H矩陣進行聚類作為譜聚類的最終結果。

3. 譜聚類的實現

     以下是unnormalized譜聚類的MATLAB版實現(部落格園的程式碼格式選擇中居然沒有Matlab的。。。這裡選個C++的):

複製程式碼
function [ C, L, D, Q, V ] = SpectralClustering(W, k)
% spectral clustering algorithm
% input: adjacency matrix W; number of cluster k 
% return: cluster indicator vectors as columns in C; unnormalized Laplacian L; degree matrix D;
%         eigenvectors matrix Q; eigenvalues matrix V

% calculate degree matrix
degs = sum(W, 2);
D = sparse(1:size(W, 1), 1:size(W, 2), degs);

% compute unnormalized Laplacian
L = D - W;

% compute the eigenvectors corresponding to the k smallest eigenvalues
% diagonal matrix V is NcutL's k smallest magnitude eigenvalues 
% matrix Q whose columns are the corresponding eigenvectors.
[Q, V] = eigs(L, k, 'SA');

% use the k-means algorithm to cluster V row-wise
% C will be a n-by-1 matrix containing the cluster number for each data point
C = kmeans(Q, k);

% convert C to a n-by-k matrix containing the k indicator vectors as columns
C = sparse(1:size(D, 1), C, 1);

end
複製程式碼

4. 相關資料

 如果想更好地瞭解譜聚類的話,強烈推薦[1];如果想全面地瞭解聚類的話,強烈推薦[2]
[1]A Tutorial on Spectral Clustering
[2]漫談 Clustering 系列

相關推薦

轉載(spectral clustering)

1. 譜聚類       給你部落格園上若干個部落格,讓你將它們分成K類,你會怎樣做?想必有很多方法,本文要介紹的是其中的一種——譜聚類。      聚類的直觀解釋是根據樣本間相似度,將它們分成不同組。譜聚類的思想是將樣本看作頂點,樣本間的相似度看作帶權的邊,從而將聚類問題轉為圖分割問題:找到一種圖分割的方

IM關於評價演算法的理解

譜聚類是基於拉普拉斯特徵對映的k近鄰聚類,matlab程式碼如下: >> n=500;c=2;k=10;t=randperm(n);a=linspace(0,2*pi,n/2)'; >> x=[a.*cos(a) a.*sin(a);(a+pi).*cos(a) (a

Matlab層次並繪製氣泡圖

%% 層次聚類 Ncluster=5; %聚類個數 %% data xx=[0.7480 0.3852 1.6347; 0.0232 0.4712 1.5317; 0.5345 1.2082 1.6758; 1.4

C++Keans演算法的C++實現

Kmeans演算法的實現步驟: 1、從D中隨機取k個元素,作為k個簇的各自的中心。 2、分別計算剩下的元素到k個簇中心的相異度(元素到簇中心的歐氏距離),將這些元素分別劃歸到相異度最低的簇。 3、根據聚類結果,重新計算k個簇各自的中心,計算方法是取簇中所有

轉載C#工具:Json操作幫助

哈希表 封裝 bst repl 遇到 json serial 轉載 res Json序列化和反序列化在程序開發中時常會遇到,在C#中可以使用很多種方法實現對數據的Json序列化和反序列化,封裝一個Json操作工具類來簡化相應的操作,該工具類中包含以下功能:對象轉JSON、數

算法總結

logs 缺點 文字檢測 什麽 spa 公司 聚類 16px 總結 前言:以前只是調用過譜聚類算法,我也不懂為什麽各家公司都問我一做文字檢測的這個算法具體咋整的,沒整明白還給我掛了哇擦嘞?訊飛和百度都以這個理由刷本寶,今天一怒把它給整吧清楚了,下次誰再問來!說不暈你算我輸!

spectral clustering

1. 譜聚類概述 譜聚類是從圖論中演化出來的演算法,後來在聚類中得到了廣泛的應用。它的主要思想是把所有的資料看做空間中的點,這些點之間可以用邊連線起來。距離較遠的兩個點之間的邊權重值較低,而距離較近的兩個點之間的邊權重值較高,通過對所有資料點組成的圖進行切圖,讓切圖後不同的子圖間邊權重和

無監督學習5:演算法原理介紹

前言:學習譜聚類,最好有一些圖論、矩陣分解(SVD)方面的知識,這樣會更加有利於譜聚類的學習。當然,譜聚類理解起來並不困難,實際操作也大多是譜聚類+K-means聚類聯合使用的。 –—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—

spectral clustering)及其實現詳解

Preface 開了很多題,手稿都是寫好一直思考如何放到CSDN上來,一方面由於公司技術隱私,一方面由於面向物件不同,要大改,所以一直沒貼出完整,希望日後可以把開的題都補充全。 先把大綱列出來: 一、從狄多公主圈地傳說說起 二、譜聚類的演算

Spectral Clustering)原理及Python實現

譜聚類原理及Python實現 圖模型   無向帶權圖模型 G=<V,E> G =< V ,

spectral clustering)原理總結

    譜聚類(spectral clustering)是廣泛使用的聚類演算法,比起傳統的K-Means演算法,譜聚類對資料分佈的適應性更強,聚類效果也很優秀,同時聚類的計算量也小很多,更加難能可貴的是實現起來也不復雜。在處理實際的聚類問題時,個人認為譜聚類是應該首先考慮的幾種演算法之一。下面我們就對譜聚類的

演算法及其程式碼(Spectral Clustering

簡介 文章將介紹譜聚類(spectral clustering)的基本演算法,以及在matlab下的程式碼實現。介紹內容將包括: 從圖分割角度直觀理解譜聚類譜聚類演算法步驟資料以及實現程式碼 本文將不會涉及細節化的證明和推導,如有興趣可參考july大

演算法(Spectral Clustering)

    譜聚類(Spectral Clustering, SC)是一種基於圖論的聚類方法——將帶權無向圖劃分為兩個或兩個以上的最優子圖,使子圖內部儘量相似,而子圖間距離儘量距離較遠,以達到常見的聚類的目的。其中的最優是指最優目標函式不同,可以是割邊最小分割——如圖1的Smallest cut(如後文的M

演算法(Spectral Clustering)優化與擴充套件

    譜聚類(Spectral Clustering, SC)在前面的博文中已經詳述,是一種基於圖論的聚類方法,簡單形象且理論基礎充分,在社交網路中廣泛應用。本文將講述進一步擴充套件其應用場景:首先是User-Item協同聚類,即spectral coclustering,之後再詳述譜聚類的進一步優化。

Spectral Clustering)演算法介紹

一. 前言 本來想寫關於聚類系列演算法的介紹,但是聚類系列的其它幾個演算法原理比較簡單,網上有大量的教程可以查閱。這裡主要是介紹一下譜聚類演算法,做一個學習筆記,同時也希望對想要了解該演算法的朋友有一個幫助。關於聚類的其他系列演算法,這裡推薦一個寫的很不錯的部落格。 譜聚

Spectral Clustering

譜聚類原理: 是一種基於圖論的聚類方法!!它將帶權無向圖劃分為兩個或兩個以上的最優子圖,使子圖內部相似,而子圖間相異,依然是很正統的聚類思想。這個思想乍看很簡單,怎麼度量相似?度量之後又如何進行劃分? 相似度度量: 普通的kNN度量方法?相近則權重大,

機器學習筆記之Cluster—— 層次 Hierarchical clustering

什麼是層次聚類Hierarchical clustering? 平面聚類是高效且概念上簡單的,但它有許多缺點。 演算法返回平坦的非結構化簇集合,需要預先指定的簇數目作為輸入並且這個數目是不確定的。 分層聚類(或分層聚類)輸出層次結構,這種結構比平面聚類返回的非結構化聚類

cs224wLecture 5 -

[TOC] 轉自本人:https://blog.csdn.net/New2World/article/details/105372317 ## Spectral Clustering 前面的課程說到了 community detection 並介紹了兩種演算法。這次來說說另外一類做社群聚類的演算法,譜聚

轉載計算機程序的思維邏輯 (87) - 加載機制

swift throw 組織 web開發 images 重啟 限定 ech 重寫 上節,我們探討了動態代理,在前幾節中,我們多次提到了類加載器ClassLoader,本節就來詳細討論Java中的類加載機制與ClassLoader。 類加載器ClassLoader就是加載其他

轉載計算機程序的思維邏輯 (13) -

als img 例子 自定義類 bin 自定義數據類型 概念 blog 方法 類 上節我們介紹了函數調用的基本原理,本節和接下來幾節,我們探索類的世界。 程序主要就是數據以及對數據的操作,為方便理解和操作,高級語言使用數據類型這個概念,不同的數據類型有不同的特征和操作,Ja