1. 程式人生 > >用於資料探勘的聚類演算法有哪些,各有何優勢?

用於資料探勘的聚類演算法有哪些,各有何優勢?

本篇部落格轉自一個BAT面試分享帖!!!

如果想全面瞭解聚類演算法並對其進行區別和比較的話,最好能把聚類的具體演算法放在整個聚類分析的語境中理解。

聚類分析其實很簡單,粗略看待就一下2個環節。

1、相似性衡量(similarity measurement)

相似性衡量又可以細分為直接法和間接法:直接法是直接求取input data的相似性,間接法是求取data中提取出的features的相似性。但無論是求data還是feature的相似性,方法都是這麼幾種:

(1)距離。距離主要就是指Minkovski距離。這個名字雖然聽起來陌生,但其演算法就是Lp norm的演算法:

如果是L1 norm,那就是絕對值/曼哈頓距離(Manhattan distance);

如果是L2 norm,那就是著名的歐式距離(Euclidean distance)了,也是應用最廣泛的;

如果L\rightarrow \infty,supremum距離,好像也有叫切比雪夫距離的,但就很少有人用了。 

另外,還有Mahalanobis距離,目前來看主要應用於Gaussian Mixture Model(GMM),還有Lance&Williams距離等等,但幾乎沒見過求距離的時候會專門用這個的。

(2)相似係數。主要有夾角餘弦和相關係數。相關係數的應用也非常廣泛,其主要優勢是它不受原線性變換的影響,而且可以輕鬆地轉換為距離,但其運算速度要比距離法慢得多,當維數很高的時候。

(3)核函式K(x,y)。定義在R^{d} \times R^{d}

上的二元函式,本質上也是反映x和y的距離。核函式的功能就是把資料從低維空間投影(project)到高維空間去。

(4)DTW(dynamic time warping)。之所以把DTW單獨拿出來,是因為它是一種非常特殊的距離演算法,它可以計算兩個不同長度的向量的距離,也可以對兩對向量中不同時間段內的資料做匹配,比如你發現2015年上半年的上證指數走勢和SP5002012年的走勢非常相似。DTW主要用在時間序列的部分場合裡,在這裡就不做具體分析了。

2、聚類演算法(clustering algorithm)

(1)Hierarchical methods(分層方法):該主要有兩種路徑:agglomerative和divisive,也可以理解為自下而上法

(bottom-up)和自上而下法(top-down)。

自下而上法就是一開始每個個體(object)都是一個類,然後根據linkage尋找同類,最後形成一個“類”。

自上而下法就是反過來,一開始所有個體都屬於一個“類”,然後根據linkage排除異己,最後每個個體都成為一個“類”。

這兩種路徑本質上沒有孰優孰劣之分,只是在實際應用的時候要根據資料特點以及你想要的“類”的個數,來考慮是自上而下更快還是自下而上更快。

至於根據Linkage判斷“類”的方法就是樓上所提到的最短距離法、最長距離法、中間距離法、類平均法等等(其中類平均法往往被認為是最常用也最好用的方法,一方面因為其良好的單調性,另一方面因為其空間擴張/濃縮的程度適中)。Hierarchical methods中比較新的演算法有:

BIRCH(Balanced Iterative Reducing and Clustering Using Hierarchies,使用層次結構的平衡迭代約簡和聚類)主要是在資料體量很大的時候使用,而且資料型別是numerical;

ROCK(A Hierarchical Clustering Algorithm for Categorical Attributes,一種分類屬性的分層聚類演算法)主要用在categorical的資料型別上;

Chameleon(A Hierarchical Clustering Algorithm Using Dynamic Modeling,一種基於動態建模的分層聚類演算法)裡用到的linkage是kNN(k-nearest-neighbor)演算法,並以此構建一個graph,Chameleon的聚類效果被認為非常強大,比BIRCH好用,但運算複雜的發很高,O(n^2)。看個Chameleon的聚類效果圖,其中一個顏色代表一類,可以看出來是可以處理非常複雜的形狀的。

(2)Partition-based methods(基於分割槽的方法):其原理簡單來說就是,想象你有一堆散點需要聚類,想要的聚類效果就是“類內的點都足夠近,類間的點都足夠遠”。

首先你要確定這堆散點最後聚成幾類,然後挑選幾個點作為初始中心點,再然後依據預先定好的啟發式演算法(heuristic algorithms)給資料點做迭代重置(iterative relocation),直到最後到達“類內的點都足夠近,類間的點都足夠遠”的目標效果。

也正是根據所謂的“啟發式演算法”,形成了k-means演算法及其變體包括k-medoids、k-modes、k-medians、kernel k-means等演算法。

k-means對初始值的設定很敏感,所以有了k-means++、intelligent k-means、genetic k-means;

k-means對噪聲和離群值非常敏感,所以有了k-medoids和k-medians;

k-means只用於numerical型別資料,不適用於categorical型別資料,所以k-modes;

k-means不能解決非凸(non-convex)資料,所以有了kernel k-means。

另外,很多教程都告訴我們Partition-based methods聚類多適用於中等體量的資料集,但我們也不知道“中等”到底有多“中”,所以不妨理解成,資料集越大,越有可能陷入區域性最小。下圖顯示的就是面對非凸,k-means和kernel k-means的不同效果。

(3)Density-based methods(基於密度的方法):上面這張圖你也看到了,k-means解決不了這種不規則形狀的聚類。於是就有了Density-based methods來系統解決這個問題。該方法同時也對噪聲資料的處理比較好。其原理簡單說畫圈兒,其中要定義兩個引數,一個是圈兒的最大半徑,一個是一個圈兒裡最少應容納幾個點。最後在一個圈裡的,就是一個類。

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)就是其中的典型,可惜引數設定也是個問題,對這兩個引數的設定非常敏感。

DBSCAN的擴充套件叫OPTICS(Ordering Points To Identify Clustering Structure)通過優先對高密度(high density)進行搜尋,然後根據高密度的特點設定引數,改善了DBSCAN的不足。下圖就是表現了DBSCAN對引數設定的敏感,你們可以感受下。

(4)Grid-based methods(基於網格的方法):這類方法的原理就是將資料空間劃分為網格單元,將資料物件集對映到網格單元中,並計算每個單元的密度。根據預設的閾值判斷每個網格單元是否為高密度單元,由鄰近的稠密單元組形成”類“。該類方法的優點就是執行效率高,因為其速度與資料物件的個數無關,而只依賴於資料空間中每個維上單元的個數。但缺點也是不少,比如對引數敏感、而只依賴於資料空間中每個維上單元的個數。但缺點也是不少,比如對引數敏感、和CLIQUE(CLustering In QUEst)是該類方法中的代表性演算法。下圖是CLIQUE的一個例子:

(5)Model-based methods(基於模型的方法):這一類方法主要是指基於概率模型的方法基於神經網路模型的方法,尤其以基於概率模型的方法居多。

這裡的概率模型主要指概率生成模型(generative Model),同一”類“的資料屬於同一種概率分佈。這中方法的優點就是對”類“的劃分不那麼”堅硬“,而是以概率形式表現,每一類的特徵也可以用引數來表達;但缺點就是執行效率不高,特別是分佈數量很多並且資料量很少的時候。其中最典型、也最常用的方法就是高斯混合模型(GMM,Gaussian Mixture Models)。

基於神經網路模型的方法主要就是指SOM(Self Organized Maps)了,也是我所知的唯一一個非監督學習的神經網路了。下圖表現的就是GMM的一個demo,裡面用到EM演算法來做最大似然估計。

3、資料簡化(data reduction),這個環節optional。其實第二部分提到的有些演算法就是對資料做了簡化,才得以具備處理大規模資料的能力,比如BIRCH。但其實你可以任意組合,所以理論上把資料簡化的方法和上面提到的十幾種聚類演算法結合使用,可以有上百個演算法了。

(1)變換(Data Transformation):離散傅立葉變換(Discrete Fourier Transformation)可以提取資料的頻域(frequency domain)資訊,離散小波變換(Discrete Wavelet Transformation)除了頻域之外,還可以提取到時域(temporal domain)資訊。

(2)降維(Dimensionality Reduction):在降維的方法中,PCA(Principle Component Analysis)和SVD(Singular Value Decomposition)作為線性方法,受到最廣泛的應用。還有像MDS(Multi-Dimensional Scaling)什麼的,不過只是作為PCA的一個擴充套件,給我的感覺是中看不中用。這幾個方法侷限肯定是無法處理非線性特徵明顯的資料。處理非線性降維的演算法主要是流形學習(Manifold Learning),這又是一大塊內容,裡面集中常見的演算法包括ISOMAP、LLE(Locally Linear Embedding)、MVU(Maximum variance unfolding)、Laplacian eigenmaps、Hessian eigenmaps、Kernel PCA、Probabilistic PCA等等。流形學習還是挺有趣的,而且一直在發展。關於降維在聚類中的應用,最著名的應該就是譜聚類(Spectral Clustering),就是先用Laplacian eigenmaps對資料降維(簡單地說,就是先將資料轉換成鄰接矩陣或相似性矩陣,再轉換成Laplacian矩陣,再對Laplacian矩陣進行特徵分解,把最小的K個特徵向量排列在一起),然後再使用k-means完成聚類。譜聚類是個很好的方法,效果通常比k-means好,計算複雜度還低,這都要歸功於降維的作用。

(3)抽樣(Sampling):最常用的就是隨機抽樣(Random Sampling)咯,如果你的資料集特別大,隨機抽樣就越能顯示出它的低複雜性所帶來的好處。比如CLARA(Clustering LARge Applications)就是因為k-medoids應對不了大規模的資料集,所以採用sampling的方法。至於更加fancy的抽樣方法我還真不瞭解,我就不在這裡好為人師而誤人子弟了。