數據挖掘中的聚類算法

如果真要做全面介紹的話,有可能是一部專著的篇幅。即使是做綜述性的介紹,一篇三五十頁的論文也可以寫成了。所以我一直想怎么能從頭到尾把這個問題logically串連起來。正好這段時間我在修改我做的交易策略里面關于聚類的部分,趁腦子熱的時候順手寫下。

就我的理解而言,如果想全面的了解聚類算法并對其進行區別和比較的話,最好能把聚類的具體算法放到整個聚類分析的語境中理解。那我接下來主要談談我的理解,就不搬弄教科書里的概念了。

聚類分析其實思路很簡單,粗略來看就是以下2個(或3個)環節。

1、相似性衡量(similarity measurement)

相似性衡量又可以細分為直接法和間接法(答主自己取的名字,求輕拍):直接法是直接求取input data的相似性,間接法是求取data中提取出的features的相似性。但無論是求data還是feature的相似性,方法都是這么幾種:

距離。距離主要就是指Minkovski距離。這個名字雖然聽起來陌生,但其算法就是Lp norm的算法,如果是L1 norm,那就是絕對值/曼哈頓距離(Manhattan distance);如果是L2 norm,那就是著名的歐式距離(Euclidean distance)了,也是應用最廣泛的;如果

,supremum距離,好像也有叫切比雪夫距離的,但就很少有人用了。另外,還有Mahalanobis距離,目前來看主要應用于Gaussian Mixture Model(GMM),還有Lance&Williams距離等等,但幾乎沒見過求距離的時候會專門用這個的。

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

核函數K(x,y)。定義在

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

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

2、聚類算法(clustering algorithm)

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的聚類效果圖,其中一個顏色代表一類,可以看出來是可以處理非常復雜的形狀的。

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的不同效果。

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對參數設置的敏感,你們可以感受下。

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

Model-based methods:這一類方法主要是指基于概率模型的方法和基于神經網絡模型的方法,尤其以基于概率模型的方法居多。這里的概率模型主要指概率生成模型(generative Model),同一”類“的數據屬于同一種概率分布。這中方法的優點就是對”類“的劃分不那么”堅硬“,而是以概率形式表現,每一類的特征也可以用參數來表達;但缺點就是執行效率不高,特別是分布數量很多并且數據量很少的時候。其中最典型、也最常用的方法就是高斯混合模型(GMM,Gaussian Mixture Models)?;谏窠浘W絡模型的方法主要就是指SOM(Self Organized Maps)了,也是我所知的唯一一個非監督學習的神經網絡了。下圖表現的就是GMM的一個demo,里面用到EM算法來做最大似然估計。

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

變換(Data Transformation):離散傅里葉變換(Discrete Fourier Transformation)可以提取數據的頻域(frequency domain)信息,離散小波變換(Discrete Wavelet Transformation)除了頻域之外,還可以提取到時域(temporal domain)信息。

降維(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好,計算復雜度還低,這都要歸功于降維的作用。

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

PS:以上所有圖示均來自于UIUC的韓家煒教授的slides,版權歸韓家煒教授所有;

PSS:如果對某個算法感興趣,還請直接讀論文、讀教材、寫代碼;

PSSS:以上三個環節,可以各選擇其中一個方法加以組合,放心地試驗,放心地玩吧,就像把不同的溶液都往一個燒瓶里倒,這里很安全,不會爆炸的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容