聚類算法匯總
標簽(空格分隔): 機器學習
作為無監督領域(unsupervised)一個太過famous的算法了,聚類(clustering)就是對大量未知標注的數據集,按照數據的內在相似性將數據集划分為多個類別,使類別內的數據相似度較大而類別間的數據相似度較小. 然而,里面仍然有很多需要注意的地方,對於聚類本身,目前也有很多改進版本了,所以還是需要總結一下的。
相似度的度量
各種相似度的度量方式及其相關性見我的這篇博客。
K-means算法
這個算法大家都熟,跟KNN是兄弟,簡單實用易操作,它也是其他一些聚類算法的鼻祖。
具體的步驟為:
對於輸入樣本\(D = x_{1}, x_{2}, x_{3}, ... ,x_{m}\):
- 選擇初始的K個class center \(\mu_{1}, \mu_{2},...,\mu_{K}\);
- 對於每個樣本\(x_{i}\),將其標記為距離類別中心最近的類別,即: \(y_{i} = argmin_{1\le j \le K}||x_{i} - \mu_{j}||\);
- 將每個類別中心更新為隸屬該類別的所有樣本的均值:
\(\mu_{j} = \frac{1}{|c_{j}|\sum_{i \in c_{j}}x_{i}}\);
4.重復上述兩步,直至算法收斂。
收斂條件為:迭代次數/簇中心變化率/最小平方誤差MSE(Minimum Squared Error)
\(E = \sum_{i=1}^{k}\sum_{x \in C_{i}}||x - \mu_{i}||_{2}^{2}\)
簇類個數怎么定?
- 根據先驗經驗:如果我們事先已經知道類的類的個數,直接設置即可。
- 增加交叉驗證;
初始的簇類中心怎么定?
K-means對初始值敏感,有可能會陷入局部最優解,可以優化如下:
- 先隨機給定1個點,然后計算所有點到這個樣本點的距離,距離越大的樣本被選中做第二個中心點的概率大,距離越小的樣本被選中的概率小;
- 這樣便有了2個簇類中心點。然后計算所有樣本到這兩個中心點的距離,選擇其他樣本點到這兩個樣本點中較近的距離作為衡量標准。距離越大被選中的概率越大;
- 這樣便有了3個簇類中心點。做法依然同上,知道選出k個簇類中心。
(這樣做並不能完全使所有所有的中心店剛好取在不同的簇類中,但是可以一定程度上避免很多樣本點取自同一個簇。而在實踐中,為了計算方便,可以直接按照距離來計算 —— 隨機選擇一個點,然后選其他中心點時如果選中的點距離該樣本點的距離小於某個閾值,則放棄。)
K-means是一個解決聚類問題的經典算法,簡單有效,但不太適合於發現非凸形狀的簇或者大小差別很大的簇,對噪聲和孤立點比較敏感。
層次聚類
層次聚類是對給定數據集進行層次的分解,直到滿足一定的條件。
- 凝聚的層次聚類:AGNES算法。一種自底向上的策略,首先將每個對象作為一個簇,然后依次合並那些原子簇使之形成更大的簇,直到滿足一定條件;
- 分裂的層次聚類:DIANA算法。一種自頂向下的策略,首先將所有對象置於一個簇中,然后逐漸細分為越來越小的簇,直到滿足一定條件。
聚類過程如圖所示:
密度聚類
密度聚類又稱基於密度的聚類(Density-based clustering),此算法假設聚類結構能通過樣本分布的緊密程度確定。其中,最著名的而一種算法叫做DBSCAN算法(Density-Based Spatial Clustering of Application with Noise).
假設給定數據集\(D = {x_{1}, x_{2},...,x_{m}}\),給出以下概念:
- \(\epsilon\)-鄰域:對於\(x_{j}\in D\),其鄰域包含樣本即D中與\(x_{j}\)的距離不大於\(\epsilon\)的樣本,即\(N_{\epsilon}(x_{j}) ={{ x_{i}\in D | dist(x_{i}, x_{j}) \le \epsilon }}\);
- 核心對象(core object):若\(x_{j}\)的\(\epsilon\)-鄰域至少包含MinPts個樣本,則\(x_{j}\)是一個核心對象;
- 密度直達(directly density-reachable):若\(x_{j}\)位於\(x_{i}\)的\(\epsilon\)-鄰域中,且\(x_{i}\)是核心對象,則稱\(x_{j}\)由\(x_{i}\)密度直達;
- 密度相連(density-connected):對\(x_{i}\)與\(x_{j}\),若存在\(x_{k}\)使得\(x_{i}\)與\(x_{j}\)均由\(x_{k}\)密度可達,則稱\(x_{i}\)與\(x_{j}\)密度相連。
算法流程:
- 如果一個點p的\(\epsilon\)-鄰域包含多於m個對象,則創建一個p作為核心對象的新簇;
- 尋找並合並核心對象直接密度可達的對象;
- 沒有新點可以更新簇時,算法結束。
譜聚類
- 譜:方針作為線性算子,它的所有特征值的全體統稱為方針的譜;
-
- 方陣的譜半徑為最大的特征值;
-
- 矩陣A的譜半徑:\((A^{T}A)\)的最大特征值。
- 譜聚類是一種基於圖論的聚類方法,通過對樣本數據的拉普拉斯矩陣的特征向量進行聚類從而達到對樣本數據聚類的目的。
假設給定一組數據\(x_{1}, x_{2},...,x_{n}\),記任意兩點之間的相似度為\(s_{ij} = <x_{i}, x_{j}>\),形成相似度圖(similarity graph):\(G = <V, E>\),如果\(s_{ij}\)大於一定的閾值,則兩點是相連的,無向圖中這兩點之間的權值記作\(s_{ij}\);
下面用相似度圖來解決樣本數據的聚類問題:找到一個圖的划分,形成若干個組,使得不同組之間有較低的權值,組內有較高的權值。
- 給定無向圖\(G = <V, E>\),則可以得到它的鄰接矩陣\(W = (w_{ij})_{i,j=1,...,n}\),(設置主對角線元素為0);
- 若兩個點的相似度值越大,表示這兩個點越相似;
- 定義\(w_{ij} = 0\)表示\(v_{i}, v_{j}\)兩個點滅有任何相似性;
- 頂點的度di形成度矩陣D(是一個對角陣):\(d_{i} = \sum_{j=1}^{n}w_{ij}\)
- W的第i行元素的和為\(v_{i}\)的度;
- 除主對角線元素,D的其他位置為0
- 未正則的拉普拉斯矩陣:L = D - W
- 正則的拉普拉斯矩陣:
- 對稱拉普拉斯矩陣\(L_{sym} = D^{-\frac{1}{2}}·L·D^{\frac{1}{2}} = I - D^{-\frac{1}{2}}·W·D^{\frac{1}{2}}\)
譜聚類算法
輸入:n個點\({p_{i}},簇的數目為k\)
- 計算n * n的相似度矩陣W和度矩陣D;
- 計算拉普拉斯矩陣L = D - W;
- 計算L的前k個特征向量\(u_{1}, u_{2}, ... ,u_{k}\);
- 將k個列向量\(u_{1}, u_{2}, ... ,u_{k}\)組成矩陣\(U,U \in R^{n*k}\);
- 對於\(i = 1,2,...,n\),令\(y_{i}\in R^{k}\)是U的第i行的向量;
- 使用k-meas算法將點\((y_{i})_{i=1,2,..,n}\)聚類成簇\(C_{1}, C_{2}, ..., C_{k}\);
- 輸出簇\(A_{1}, A_{2},...,A_{k}\),其中,\(A_{i} = \{j|y_{i} \in C_{i}\}\)
譜聚類算法有點像降維算法哦。
可以使用正則化的拉普拉斯矩陣代替算法中未正則過的。