1. 程式人生 > >Subspace Clustering詳解(附帶CLIQUE演算法詳解)

Subspace Clustering詳解(附帶CLIQUE演算法詳解)

Subspace Clustering詳解

第二十四次寫部落格,本人數學基礎不是太好,如果有幸能得到讀者指正,感激不盡,希望能借此機會向大家學習。這一篇作為密度聚類演算法族的第三篇,主要是介紹一種用來發現子空間中的簇的演算法——Subspace Clustering,並對該類演算法中最具代表性的CLIQUE(Clustering in quest)演算法進行介紹,其他密度聚類演算法的連結可以在《DBSCAN詳解(密度聚類演算法開篇)》這篇文章的最後找到。

子空間聚類(Subspace Clustering)

  在聚類任務中,有時考慮資料集的所有屬性會降低聚類效率和簇的有效性,因為樣本在某些屬性上存在真正的簇劃分,而在其他屬性上則是隨機分佈的,這時在資料集高維空間中的低維子空間中進行聚類就十分重要了,而且不同的子空間會產生不同的簇劃分。以不同溫度、風速和太陽輻射下的臭氧含量為例,如下圖所示不同顏色表示臭氧含量的不同

圖1 不同溫度、風速和太陽輻射下的臭氧含量

下面在三個不同的子空間觀察這些資料,可以看出在這些空間中資料分佈各有特點,有些空間中的資料甚至看不出明確的簇

圖2 不同特徵子空間中的資料

  上述例子展示了不同特徵子空間中的資料所呈現的不同特點,下面用一個更加明確的例子來展示子空間聚類的效果,如下圖所示,在三維空間中存在三個簇分別標記為菱形、正方形和三角形,還有一些看似隨機分佈的被標記為圓形的樣本,下面採用等寬法將每個特徵劃分為20個區間,每個區間的寬度為0.1,由於每個網格單元是等體積(面積)的,因此單元中的樣本點數即單元密度,下面將鄰接的稠密單元合併為一個簇,以一維空間下的屬性xx為例,如圖(4)所示可以識別出三個簇

圖3 子空間聚類
圖4 關於屬性x的分佈直方圖

  上述例子闡釋了兩個道理,第一,一個點集(如上圓形點)在整個屬性空間上可能不能形成簇,但是在子空間中卻可能形成簇,第二,存在於整個屬性空間(甚至子空間)中的簇會作為低維空間中的簇出現。因此,往往需要在子空間中發現簇,而這些簇可能是高維空間中的簇的投影,但是發現低維空間中的簇正是這種聚類演算法的目的。

CLIQUE(Clustering in quest)聚類

  CLIQUE聚類是在1998年由Rakesh Agrawal、Johannes Gehrke等人提出的(原始文獻見《Automatic Subspace Clustering of High Dimensional Data for Data Mining Applications》),一種子空間聚類方式,並且應用了基於網格的聚類方法,該演算法主要具有以下優點:(1)可伸縮性(2)可以發現在資料集高維空間中子空間的簇(3)聚類模型具有很好的解釋性(4)沒有對輸入資料的次序依賴性(5)不需要事先假定資料集滿足某種概率分佈。與DBSCAN等基於密度的聚類演算法不同的是,CLIQUE演算法並不關注整個高維空間,因此它可以更有效的得到原始資料空間的子空間的簇。CLIQUE演算法步驟分為一下三部分:   1) 識別包含簇的子空間;   2) 識別這些簇;   3) 產生這些簇的 “最小描述”。 其中,最小描述(minimal description)是指這些簇不重複包含任意稠密網格單元,下面分別對上述部分進行介紹。 (1) 識別包含簇的子空間   識別包含簇的子空間的困難在於如何尋找子空間中的稠密網格單元,最簡單的方法是基於子空間中每個網格單元所含有的樣本點數,來繪製所有子空間的樣本點分佈直方圖,然後根據這些直方圖進行判斷。顯而易見的是,這種方法並不適用於高維資料集,因為子空間的數量隨維度的增加呈指數級增長。Rakesh Agrawal在本文中介紹了另一種“由下至上”(bottom-up)的識別方法,這種方法的理論依據是簇評判的單調性原則。   簇評判的單調性原則:如果一個樣本點集(簇)S

Skk維空間的一個簇,那麼SS是該空間的任意k1k-1維子空間中某個簇的一部分。證明如下,假設SSkk維空間的一個簇,由基於網格聚類的原理可知,這個簇是由多個稠密且鄰接的網格單元組成的,在任意子空間的某個對應網格中必定存在所有的這些點,因此這個子空間的網格也是稠密的,而SS中這些稠密網格的臨近性在子空間中也會得到保持。   這種演算法是“逐級執行”的,他首先遍歷一次原始資料集,得到11維稠密網格單元,當得到k1k-1維稠密網格單元后,就可以通過下圖(圖5)所示的步驟產生候選的kk維稠密網格單元,得到候選的kk維稠密網格單元后,再遍歷一次資料集來確定真正的kk維稠密網格單元,重複上述操作直到不再產生候選的稠密單元為止。

圖5 候選產生步驟的虛擬碼

  上圖所示的步驟將所有k1k-1維稠密網格單元的集合Dk1D_{k-1}作為引數,最終得到一個包含所有kk維稠密網格單元集合的超集CkC_k,其中,uiu_i代表第ii個稠密的k1k-1維網格單元,ui.aju_i.{a_j}代表uiu_i的第jj個維,而ui.hju_i.{h_j}ui.lju_i.{l_j}分別代表uiu_i所在的第jj個維的網格上界和下界。wherewhere中的虛擬碼用於篩選兩個相似的k1k-1維稠密網格單元,他們在k2k-2個維度上是相同的,然後將他們組成一個候選的kk維稠密網格單元,在這裡我們可以看出,為了不會產生重複的候選稠密網格單元,在篩選條件的最後一行使用的是u1.ak1<u2.ak1u_1.{a_{k-1}}<u_2.{a_{k-1}}而不是u1.ak1u2.ak1u_1.{a_{k-1}}\neq{u_2.{a_{k-1}}},要注意的是,這裡的維度比較是依賴於下標的有次序的比較,而不是交叉比較。   上述步驟與Apriori演算法產生候選頻繁項集的方法類似,在重新遍歷一次資料集來找到CkC_k中的真正稠密單元之前,由簇評判的單調性原則可知,在得到包含所有kk維稠密網格單元集合的超集CkC_k後,要先刪除集合中那些在任何一個k1k-1維子空間中不稠密的kk維網格單元,之後再進行資料集的遍歷。   這種使用先驗知識約束來縮小搜尋空間的方法與Apriori演算法中尋找頻繁項集的方法類似,他具有可伸縮性的特點,其時間複雜度是O(ck+mk)O\left(c^{k}+mk\right)cc是一個常數,kk是所有稠密單元的最大維度,mm是資料集的樣本點個數,通過特定的手段可以減少遍歷資料集的次數。與一般的基於密度的聚類方法相同,當評判網格稠密與否的閾值τ\tau設定的過小時,維數較低的子空間將會產生更多地稠密單元,隨著這些被誤判為包含簇的子空間數目上升,搜尋空間將會以指數級增長。為了應對這種問題,文中還提出了一種基於“最小描述長度”(MDL)原則的改進方法,這種方法通過只關注那些“有趣的”子空間來大大減小搜尋空間。 (2) 識別稠密單元產生的簇   這裡簇識別的方法與基於網格的聚類相同,都是將鄰接的稠密網格單元結合成為一個簇,具體的說,基於“深度優先原則”,先從kk維稠密單元集合CkC_k(虛擬碼中用uu表示)中隨機選出一個稠密的網格單元,並將它單獨初始化為一個簇,之後遍歷CkC_k將與該單元鄰接的稠密單元劃分到這個簇中,如果遍歷完成後仍存在沒有被劃分的單元,那麼在這些單元中隨機再取出一個作為新的簇,然後重複上一步驟,直到所有的單元均有各自的簇隸屬為止。該演算法的時間複雜度為O(2nk)O\left(2nk\right)nnCkC_k的大小,如果採用雜湊樹等資料結構,會得到更快的搜尋速度,虛擬碼如下圖所示。

圖6 識別簇的虛擬碼

(3) 產生簇的“最小描述”   這一部分是全文的核心的核心,他決定了最後得到的聚類模型的可解釋性,該過程將某個kk維子空間SS中的多個互斥的簇(稠密網格單元集合)未作為輸入,輸出的是簇的“最小描述”,這個“最小描述”是一個區域(region)的集合R\mathfrak{R},其中每個區域RRR\in{\mathfrak{R}}都包含在稠密網格單元集合CkC_k中,並且CkC_k中的每個稠密單元都要至少屬於這些區域中的一個,這顯然是一個NP-hard問題。Rakesh Agrawal在本文中給出的方法具體分為兩步:   1) 使用“貪心增長演算法”,獲得覆蓋每個簇的最大區域;   2) 通過丟棄被重複覆蓋的網格單元,來得到“最小描述”。 下面分別對這兩步進行詳細描述,   a) 獲得覆蓋每個簇的最大區域   在這一步中,我們將簇中的某個稠密單元作為初始區域,然後在某一個維度上,基於其(左、右)鄰接單元將該區域進行延伸,延伸完成後,在另一個維度上,基於該區域中的所有稠密單元的鄰接單元對該區域做進一步延伸,重複上述步驟直到遍歷所有的kk個維度,然後對該簇中沒有被包含到對應區域的單元繼續重複上術操作,直到沒有孤立的網格單元為止,需要注意的是,上述操作形成的區域是一個空間線性多邊體。下面舉一個2維空間的例項來進行說明(如圖7所示),假設f1f_1f2f_2為該子空間的兩個維度,用灰色代表稠密單元,其中稠密單元uu是我們選擇的初始區域,首先將uu在維度f1f_1上做延伸得到區域AA,然後基於區域AA中每個單元,對該區域在維度f2f_2上做進一步延伸得到區域BB。完成上述步驟後,可以注意到單元ww沒有被包含到該區域中,這時可以對ww重複上述操作。

圖7 貪心增長演算法例項

  可以證明在最壞的情況下,該演算法的時間複雜度是O(n2(k1)/k)O\left(n^{2\left(k-1\right)/k}\right),這裡nn是該簇所含稠密單元的數量,kk是該簇所在子空間的維數,這裡的“最壞情況”指的是,對於nn個稠密單元,這些單元組成的鄰接區域含有O(n(k1)/k)O\left(n^{\left(k-1\right)/k}\right)個“角”,下面舉一個2維空間的例項(如圖8),可以看出該演算法在這個空間中的時間複雜度為O(n)O\left(n\right)

圖8 2維空間下的最壞情況分析

  b) 得到“最小描述”   這裡文中推薦使用一種啟發式的移除冗餘單元的方法,具體來說就是首先找到最小的(包含的稠密單元數量最少)最大區域,如果這個最大區域中的每個單元均在其他區域中重複出現過,那麼就從該簇的最大區域集合中移除該區域,直到找不到下一個類似區域為止,該演算法的時間複雜度是O(n2)O\left(n^2\right)。由於簇的每個區域都可以用一組基於子空間維度的不等式來表示,因此最終通過這些不等式來描述整個簇。

參考資料

【1】《機器學習》周志華 【2】《資料探勘導論》 【3】Agrawal R, Gehrke J, Gunopulos D, et al. Automatic subspace clustering of high dimensional data for data mining applications[C]// ACM SIGMOD International Conference on Management of Data. ACM, 1998:94-105.