前面我們已經(jīng)分別介紹了Kmeans和GMM聚類模型,下面我們?cè)俳榻B兩個(gè)很實(shí)用的聚類算法坯临。
DBSCAN密度聚類
KMeans聚類的形狀一般對(duì)數(shù)據(jù)的本身特性要求較高(球狀)妥箕,但是在很多實(shí)際場(chǎng)景中未能很好滿足該特性接奈。如果類別的形狀比較特殊缭嫡,例如下圖秦驯,我們從肉眼可以很容易看出類別的分布,如果從緊密程度角度出發(fā),似乎可以把數(shù)據(jù)分出來祭刚,DBSCAN正是這樣一種算法。
- DBSCAN
DBSCAN是一種基于密度聚類的算法墙牌,它基于一組鄰域參數(shù)(min_dist, min_points)來刻畫
下面我們給幾個(gè)概念說明下這組參數(shù)
已知數(shù)據(jù)集合D={x1, x2, ..., xn}
- min_dist鄰域
對(duì)xj樣本涡驮,它的min_dist鄰域表示數(shù)據(jù)集合中與xj的距離不大于min_dist的樣本,即
- 核心對(duì)象
如果xj樣本的鄰域集合包含的樣本個(gè)數(shù)至少有min_points個(gè)憔古,那么可以認(rèn)為xj樣本是一個(gè)核心對(duì)象
我們的目標(biāo)就是希望在樣本集合里通過上述兩個(gè)參數(shù)描述找到合適的聚類類別遮怜。
算法描述如下:
- 初始化核心對(duì)象集合 O={}
- for i=1, 2, ..., n do
- 計(jì)算樣本xi的鄰域N(xi),如果鄰域數(shù)量大于min_points鸿市,則樣本xi加入到核心對(duì)象集合O锯梁,否則不加入。
- end for
- 初始化聚類簇?cái)?shù)k=0
- 初始化未訪問的樣本集合 F=D
- while O部位空集合 do
- 記錄當(dāng)前未訪問集合 Fold = F
- 從核心對(duì)象集合中隨機(jī)選擇一個(gè)對(duì)象o焰情,O=O\o, F=F\o,設(shè)置初始化隊(duì)列Q={o}
- while Q<>{} do
- 取出隊(duì)列Q中的首個(gè)樣本q
- 如果q也是一個(gè)核心對(duì)象陌凳,令T = N(q)和F的交集,將T的數(shù)據(jù)集合加入到Q隊(duì)列内舟,同時(shí)從F中去除掉T的元素合敦。
- end while
- k=k+1 ,生成類簇Ck=Fold\F
- end while
DBSCAN聚類主要還是圍繞核心對(duì)象進(jìn)行的验游,如果核心對(duì)象的鄰域內(nèi)包含別的核心對(duì)象充岛,根據(jù)密度的傳遞性,那么該對(duì)象和鄰域也是另一個(gè)核心對(duì)象的鄰域耕蝉。
大家肯定會(huì)想到崔梗,那如果不是核心對(duì)象的樣本豈不是在這里就不會(huì)被最終分為類別了?對(duì)的垒在,基于密度聚類有個(gè)好處就是蒜魄,不會(huì)強(qiáng)制給每個(gè)樣本都分配一個(gè)類別,對(duì)于DBSCAN來說场躯,這些樣本相當(dāng)于是一個(gè)離群點(diǎn)谈为。在sklearn算法中,這些離群點(diǎn)會(huì)以label=-1的形式給出踢关。在實(shí)際實(shí)用中伞鲫,DBSCAN這種特性可以讓我們剔除掉不合適的樣本,但是有個(gè)問題签舞,就是(min_dist, min_points)參數(shù)調(diào)節(jié)問題榔昔。這里需要根據(jù)我們的特征向量來決定驹闰。
本節(jié)剛開始我們給了一個(gè)樣例,如果利用DBSCAN撒会,我們可以非常輕松分開(注意min_dist的設(shè)置)
層次聚類
層次聚類顧名思義嘹朗,就是根據(jù)樣本特性逐層“自底向上”或者“自頂向下”來聚類。
- “自底向上”:先假設(shè)每個(gè)樣本都是類別诵肛,然后每一次尋找距離最小的兩個(gè)類簇屹培,把他們聚合成一個(gè)類別,然后依次下去怔檩,直至達(dá)到我們需要的類別數(shù)褪秀。
- “自頂向下”: 先假設(shè)所有的樣本只屬于一個(gè)類別,然后根據(jù)某個(gè)評(píng)價(jià)指標(biāo)把樣本分為兩個(gè)簇(例如之前kmeans例提到的二分法)薛训,找到類簇內(nèi)距離較大的類別媒吗,繼續(xù)拆分,直至我們需要的類別數(shù)乙埃。
這里涉及到如何定義兩個(gè)類別的距離闸英,一般常用的方法有
層次聚類算法過程如下圖所示
本節(jié)詳細(xì)描述可以參考周志華老師的《機(jī)器學(xué)習(xí)》(西瓜書)