六大常见聚类方法
1. K-Means(K均值)聚類
算法步驟:
(1) 首先我們選擇一些類/組,并隨機初始化它們各自的中心點。中心點是與每個數據點向量長度相同的位置。這需要我們提前預知類的數量(即中心點的數量)。
(2) 計算每個數據點到中心點的距離,數據點距離哪個中心點最近就劃分到哪一類中。
(3) 計算每一類中中心點作為新的中心點。
(4) 重復以上步驟,直到每一類中心在每次迭代后變化不大為止。也可以多次隨機初始化中心點,然后選擇運行結果最好的一個。
下圖演示了K-Means進行分類的過程:
優點:
速度快,計算簡便
缺點:
我們必須提前知道數據有多少類/組。
K-Medians是K-Means的一種變體,是用數據集的中位數而不是均值來計算數據的中心點。
K-Medians的優勢是使用中位數來計算中心點不受異常值的影響;缺點是計算中位數時需要對數據集中的數據進行排序,速度相對于K-Means較慢。
2. 均值漂移聚類
均值漂移聚類是基于滑動窗口的算法,來找到數據點的密集區域。這是一個基于質心的算法,通過將中心點的候選點更新為滑動窗口內點的均值來完成,來定位每個組/類的中心點。然后對這些候選窗口進行相似窗口進行去除,最終形成中心點集及相應的分組。
具體步驟:
1. 確定滑動窗口半徑r,以隨機選取的中心點C半徑為r的圓形滑動窗口開始滑動。均值漂移類似一種爬山算法,在每一次迭代中向密度更高的區域移動,直到收斂。
2. 每一次滑動到新的區域,計算滑動窗口內的均值來作為中心點,滑動窗口內的點的數量為窗口內的密度。在每一次移動中,窗口會想密度更高的區域移動。
3. 移動窗口,計算窗口內的中心點以及窗口內的密度,知道沒有方向在窗口內可以容納更多的點,即一直移動到圓內密度不再增加為止。
4. 步驟一到三會產生很多個滑動窗口,當多個滑動窗口重疊時,保留包含最多點的窗口,然后根據數據點所在的滑動窗口進行聚類。
下圖演示了均值漂移聚類的計算步驟:
下面顯示了所有滑動窗口從頭到尾的整個過程。每個黑點代表滑動窗口的質心,每個灰點代表一個數據點。
優點:(1)不同于K-Means算法,均值漂移聚類算法不需要我們知道有多少類/組。
(2)基于密度的算法相比于K-Means受均值影響較小。
缺點:(1)窗口半徑r的選擇可能是不重要的。
3. 基于密度的聚類方法(DBSCAN)
與均值漂移聚類類似,DBSCAN也是基于密度的聚類算法。
具體步驟:
1. 首先確定半徑r和minPoints. 從一個沒有被訪問過的任意數據點開始,以這個點為中心,r為半徑的圓內包含的點的數量是否大于或等于minPoints,如果大于或等于minPoints則改點被標記為central point,反之則會被標記為noise point。
2. 重復1的步驟,如果一個noise point存在于某個central point為半徑的圓內,則這個點被標記為邊緣點,反之仍為noise point。重復步驟1,知道所有的點都被訪問過。
優點:不需要知道簇的數量
缺點:需要確定距離r和minPoints
4. 用高斯混合模型(GMM)的最大期望(EM)聚類
K-Means的缺點在于對聚類中心均值的簡單使用。下面的圖中的兩個圓如果使用K-Means則不能作出正確的類的判斷。同樣的,如果數據集中的點類似下圖中曲線的情況也是不能正確分類的。
使用高斯混合模型(GMM)做聚類首先假設數據點是呈高斯分布的,相對應K-Means假設數據點是圓形的,高斯分布(橢圓形)給出了更多的可能性。我們有兩個參數來描述簇的形狀:均值和標準差。所以這些簇可以采取任何形狀的橢圓形,因為在x,y方向上都有標準差。因此,每個高斯分布被分配給單個簇。
所以要做聚類首先應該找到數據集的均值和標準差,我們將采用一個叫做最大期望(EM)的優化算法。下圖演示了使用GMMs進行最大期望的聚類過程。
具體步驟:
1. 選擇簇的數量(與K-Means類似)并隨機初始化每個簇的高斯分布參數(均值和方差)。也可以先觀察數據給出一個相對精確的均值和方差。
2. 給定每個簇的高斯分布,計算每個數據點屬于每個簇的概率。一個點越靠近高斯分布的中心就越可能屬于該簇。
3. 基于這些概率我們計算高斯分布參數使得數據點的概率最大化,可以使用數據點概率的加權來計算這些新的參數,權重就是數據點屬于該簇的概率。
4. 重復迭代2和3直到在迭代中的變化不大。
GMMs的優點:(1)GMMs使用均值和標準差,簇可以呈現出橢圓形而不是僅僅限制于圓形。K-Means是GMMs的一個特殊情況,是方差在所有維度上都接近于0時簇就會呈現出圓形。
(2)GMMs是使用概率,所有一個數據點可以屬于多個簇。例如數據點X可以有百分之20的概率屬于A簇,百分之80的概率屬于B簇。也就是說GMMs可以支持混合資格。
5. 凝聚層次聚類
層次聚類算法分為兩類:自上而下和自下而上。凝聚層級聚類(HAC)是自下而上的一種聚類算法。HAC首先將每個數據點視為一個單一的簇,然后計算所有簇之間的距離來合并簇,知道所有的簇聚合成為一個簇為止。
下圖為凝聚層級聚類的一個實例:
具體步驟:
1. 首先我們將每個數據點視為一個單一的簇,然后選擇一個測量兩個簇之間距離的度量標準。例如我們使用average linkage作為標準,它將兩個簇之間的距離定義為第一個簇中的數據點與第二個簇中的數據點之間的平均距離。
2. 在每次迭代中,我們將兩個具有最小average linkage的簇合并成為一個簇。
3. 重復步驟2知道所有的數據點合并成一個簇,然后選擇我們需要多少個簇。
層次聚類優點:(1)不需要知道有多少個簇
(2)對于距離度量標準的選擇并不敏感
缺點:效率低
6. 圖團體檢測(Graph Community Detection)
當我們的數據可以被表示為網絡或圖是,可以使用圖團體檢測方法完成聚類。在這個算法中圖團體(graph community)通常被定義為一種頂點(vertice)的子集,其中的頂點相對于網絡的其他部分要連接的更加緊密。下圖展示了一個簡單的圖,展示了最近瀏覽過的8個網站,根據他們的維基百科頁面中的鏈接進行了連接。
模塊性可以使用以下公式進行計算:
M=12L∑Ni,j=1(Aij?kiKj2L)δCi,CjM=12L∑i,j=1N(Aij?kiKj2L)δCi,Cj函數(Kronecker-delta function). 下面是其Python解釋:
- 1
- 2
- 3
- 4
- 5
通過上述公式可以計算圖的模塊性,且模塊性越高,該網絡聚類成不同團體的程度越好,因此通過最優化方法尋找最大模塊性就能發現聚類該網絡的最佳方法。
組合學告訴我們對于一個僅有8個頂點的網絡,就存在4140種不同的聚類方式,16個頂點的網絡的聚類方式將超過100億種。32個頂點的網絡的可能聚類方式更是將超過10^21種。因此,我們必須尋找一種啟發式的方法使其不需要嘗試每一種可能性。這種方法叫做Fast-Greedy Modularity-Maximization(快速貪婪模塊性最大化)的算法,這種算法在一定程度上類似于上面描述的集聚層次聚類算法。只是這種算法不根據距離來融合團體,而是根據模塊性的改變來對團體進行融合。
具體步驟:
1. 首先初始分配每個頂點到其自己的團體,然后計算整個網絡的模塊性 M。
2. 第 1 步要求每個團體對(community pair)至少被一條單邊鏈接,如果有兩個團體融合到了一起,該算法就計算由此造成的模塊性改變 ΔM。
3. 第 2 步是取 ΔM 出現了最大增長的團體對,然后融合。然后為這個聚類計算新的模塊性 M,并記錄下來。
4. 重復第 1 步和 第 2 步——每一次都融合團體對,這樣最后得到 ΔM 的最大增益,然后記錄新的聚類模式及其相應的模塊性分數 M。
5. 重復第 1 步和 第 2 步——每一次都融合團體對,這樣最后得到 ΔM 的最大增益,然后記錄新的聚類模式及其相應的模塊性分數 M。
總結
- 上一篇: 音频隐写术:分析剑桥大学提出的MP3St
- 下一篇: FastAPI 对MySQL 数据库的操