本文介紹無監督學習算法,無監督學習是在樣本的標簽未知的情況下,根據樣本的內在規律對樣本進行分類,常見的無監督學習就是聚類算法。
在監督學習中我們常根據模型的誤差來衡量模型的好壞,通過優化損失函數來改善模型。而在聚類算法中是怎么來度量模型的好壞呢?聚類算法模型的性能度量大致有兩類:
1)將模型結果與某個參考模型(或者稱為外部指標)進行對比,私認為這種方法用的比較少,因為需要人為的去設定外部參考模型。
2)另一種是直接使用模型的內部屬性,比如樣本之間的距離(閔可夫斯基距離)來作為評判指標,這類稱為內部指標。
1、K-means聚類
K-means算法是聚類算法的一種,實現起來比較簡單,效果也不錯。K-means的思想很簡單,對於給定的樣本集,根據樣本之間距離的大小將樣本划分為K個簇(在這里K是需要預先設定好的),在進行划分簇時要盡量讓簇內的樣本之間的距離很小,讓簇與簇之間的距離盡量大。
在給定的數據集D的條件下,將數據集划分為K類,則K-means的數學模型可以表示為:
其中$C_i$為第$i$類的集合,$\mu_i$為第$i$類的簇心(該簇內所有樣本的均值,也稱為均值向量)
K-means算法的具體流程如下(數據來源 機器學習-周志華版):
在這里主要核心有兩步:一是計算樣本到各簇心的距離,將樣本划分到距離最小的那一簇中;二是在將所有的樣本都划分完之后,計算各簇心的樣本均值向量,然后將該均值向量設為新的簇心。而迭代的終止條件是當前均值向量和簇心是基本一致。
對於K-means有兩個可以優化的地方:
1)在初始化時,隨機選擇K個樣本作為初始的簇心,倘若此時隨機的結果不好,比如兩個隨機的簇心挨得很近,這可能會導致模型收斂的速度減慢,常見的解決方式是先隨機選取一個樣本作為簇心,計算樣本到該簇心的距離,隨機選擇下一個簇心,此時選取時會傾向於選擇和與最近簇心之間距離較大的樣本作為簇心,直到選擇完K個簇心。
2)每次迭代時都要計算所有樣本和所有簇心之間的距離,若此時樣本很大,或者簇心很多時,計算代價是非常大的,因此每次隨機抽取一小批樣本來更新當前的簇心(通過無放回隨機采樣)。除了這種方式之外還有一種K-means方法(elkan K-means)也可以減少距離的計算。
K-means算法的優點:
1)原理簡單,實現容易,且收斂速度也較快。
2)聚類效果較好,而且可解釋性較強。
3)參數很少,需要調的參數只有簇的個數K。
K-means算法的缺點:
1)K值的選取比較難
2)對於非凸數據集收斂比較難
3)如果隱含類別的數據不平衡,則聚類效果不佳,比如隱含類型的方差不同,方差較大的類中的樣本可能會被聚類到其他類別中,在聚類時原則上沒啥影響,但是聚類或者說無監督學習大多時候都是一些預訓練,聚類后的數據可能之后會被用於其他的分類回歸模型中
4)對噪聲和異常點比較敏感
5)迭代得到的結果只是局部最優
2、密度聚類與DBSCAN
密度聚類算法假定聚類結構能通過樣本分布的緊密程度來確定。同一類別的樣本,他們之間是緊密相連的,通過樣本密度來考察樣本之間的可連接性,並基於可連接樣本不斷擴展聚類簇以獲得最終的聚類結果。因此密度聚類也是不需要提前設置簇數K的值的。
DBSCAN是基於一組領域來描述樣本集的緊密程度的,在描述DBSCAN算法之前我們先引入幾個概念:
給定數據集D{x1, x2, ......xn}
1)ϵ- 鄰域:對於xi ,其鄰域中包含了所有與xi 的距離小於ϵ 的樣本。
2)核心對象:對於任一樣本xj∈D,如果其ϵ-鄰域對應的N ϵ (xj)至少包含MinPts個樣本,即如果|N ϵ (xj)| ≥ MinPts,則xj是核心對象。
3)密度直達:如果xi 位於xj 的ϵ-鄰域中,且xj 是核心對象,則稱xi 由xj 密度直達。注意反之不一定成立,即此時不能說xj 由xi 密度直達, 除非且xi 也是核心對象。
4)密度可達:對於xi和xj,如果存在樣本樣本序列p1, p2,..., pT,滿足p1=xi,pT=xj,且pt+1由pt 密度直達,則稱xj 由xi 密度可達。也就是說,密度可達滿足傳遞性。此時序列中的傳遞樣本p1,p2,...,pT−1均為核心對象,因為只有核心對象才能使其他樣本密度直達。注意密度可達也不滿足對稱性,這個可以由密度直達的不對稱性得出。
5)密度相連:對於xi和xj,如果存在核心對象樣本xk,使xi和xj均由xk密度可達,則稱xi和xj密度相連。注意密度相連關系是滿足對稱性的。
如下圖所示,對於給定的MinPts=5,紅點都是核心對象,黑色的樣本點都是非核心對象。
DBSCAN的核心思想:有密度可達關系導出的最大的密度相連樣本集合。即分類簇C必須滿足:
1)連接性:xi∈ C,xj∈ C,可以直接推出xi 與xj 密度相連,同簇內的元素必須滿足密度相連
2)最大性:xi∈ C,xj 有xi 密度可達可以推出xj ∈C
DBSCAN算法的具體流程如下:
1)根據預先給定的(ϵ,MinPts)確定核心對象的集合
2)從核心對象集合中任選一核心對象,找出由其密度可達的對象生成聚類簇
3)從核心對象中除掉已選的核心對象和已分配到簇中的核心對象(這說明在一個簇內肯能存在多個核心對象)
4)重復2,3 步驟,直到所有的核心對象被用完
DBSACN算法理解起來還是比較簡單的,但是也存在一些問題:
1)在所有的核心對象都被用完之后,可能還是會存在一些樣本點沒有被分配到任何簇中,此時我們認為這些樣本點是異常點
2)對於有的樣本可能會屬於多個核心對象,而且這些核心對象不是密度直達的,那么在我們的算法中事實上是采用了先來先到的原則
與K-means算法相比,DBSCAN算法有兩大特點,一是不需要預先設定簇數K的值,二是DBSCAN算法同時適用於凸集和非凸集,而K-means只適用於凸集,在非凸集上可能無法收斂。對於DBSCAN算法適用於稠密的數據或者是非凸集的數據,此時DBSCAB算法的效果要比K-means算法好很多。因此若數據不是稠密的,我們一般不用DBSCAN算法。
DBSCAN算法的優點:
1)可以對任意形狀的稠密數據進行聚類(包括非凸集)
2)可以在聚類是發現異常點,對異常點不敏感
3)聚類結果比較穩定,不會有什么偏倚,而K-means中初始值對結果有很大的影響
DBSCAN算法的缺點:
1)樣本集密度不均勻時,聚類間距相差很大時,聚類效果不佳
2)樣本集較大時,收斂時間長,可以用KD樹進行最近鄰的搜索
3)需要調試的參數比K-means多些,需要去調試ϵ 和MinPts參數(聯合調參,不同的組合的結果都不一樣)
3、層次聚類和AGNES算法
層次聚類試圖在不同的層次上對數據集進行划分,從而形成樹形的聚類結構,數據集的划分可采用 “自底向上”的聚類策略,也可以采用“ 自頂向下” 的策略。在構建樹之后,所有的樣本都位於葉節點中,葉節點的個數就是簇數。
AGNES是一種采用自底向上的聚類策略的層次聚類算法。AGNES的核心思想是先將數據集中的每個樣本看作一個初始聚類簇,然后每次迭代時找出距離最近的兩個簇進行合並,依次迭代知道簇類的個數達到我們指定的個數K為止,這種方法的好處是隨着簇類數量的減少,需要計算的距離也會越來越少,而且相對K-means,不需要考慮初始化時隨機簇心對模型到來的影響。
之前講到的距離計算都是樣本之間的計算,那么關於簇與簇之間的距離該如何計算呢,在這里主要有三種計算策略:
AGNES具體的算法流程如下(數據來源 機器學習-周志華版):
關於層次聚類,除了AGNES算法之外,還有BIRCH算法,BIRCH算法適用於數據量大,簇類K的數量較多的情況下,這種算法只需要遍歷一遍數據集既可以完成聚類,運行速度很快。BIRCH算法利用了一個類似於B+樹的樹結構來幫助我們快速聚類,一般我們將它稱為聚類特征數(簡稱CF Tree),BIRCH算法屬於自上向下的層次聚類算法(根據數據集的導入自上而下不斷的分裂加層來構建CF 樹),CF 樹中的每個葉節點就對應着一個簇。因此BIRCH算法事實上就是在構建一顆樹,構建完之后,樹的葉節點就是對應的簇,葉節點中的樣本就是每個簇內的樣本。BIRCH適用於大樣本集,收斂速度快,且不需要設定簇數K的值,但是要設定樹的結構約束值(比如葉節點中樣本的個數,內節點中樣本的個數),此外BIRCH算法對於數據特征維度很大的樣本(比如大於20維)不適合。