帶你重溫聚類方法


目錄

一、什麼是聚類

1.1 聚類的定義

聚類(Clustering)是按照某個特定標準(如距離)把一個數據集分割成不同的類或簇,使得同一個簇內的數據對象的相似性儘可能大,同時不在同一個簇中的數據對象的差異性也儘可能地大。也即聚類後同一類的數據儘可能聚集到一起,不同類數據儘量分離。

1.2 聚類和分類的區別

  • 聚類(Clustering):是指把相似的數據劃分到一起,具體劃分的時候並不關心這一類的標籤,目標就是把相似的數據聚合到一起,聚類是一種無監督學習(Unsupervised Learning)方法。
  • 分類(Classification):是需要標註數據是某種具體的類型,通過訓練數據集獲得一個分類器,再通過分類器去預測未知數據的過程,分類是一種監督學習(Supervised Learning)方法。

1.3 聚類的一般過程

  1. 數據準備:特徵標準化和降維
  2. 特徵選擇:從最初的特徵中選擇最有效的特徵,並將其存儲在向量中
  3. 特徵提取:通過對選擇的特徵進行轉換形成新的突出特徵
  4. 聚類:基於某種距離函數進行相似度度量,獲取簇
  5. 聚類結果評估:分析聚類結果,如SSE

1.4 數據對象間的相似度度量

對於數值型數據,可以使用下表中的相似度度量方法。

相似度度量準則 相似度度量函數
Euclidean 距離 d(x,y)=i=1n(xiyi)2d( x, y)=\sqrt{\sum_{i=1}^{n}(x_i-y_i)^2}
Manhattan 距離 d(x,y)=i=1nxiyid(x, y)=\sum_{i=1}^{n}\left \|x_i-y_i \right\|
Chebyshev 距離 d(x,y)=maxi=1,2,,nnxiyid( x, y)=\max_{i=1,2,…,n}^{n}\left\|x_i-y_i \right\|
Minkowski 距離 d(x,y)=[i=1n(xiyi)p]1pd( x, y)=[\sum_{i=1}^{n}(x_i-y_i)^p]^ {\frac{1}{p}}

Minkowski距離就是$ Lp 範數(p≥1$),而 Manhattan 距離、Euclidean距離、Chebyshev距離分別對應 p=1,2,p=1,2,∞時的情形。

1.5 cluster之間的相似度度量

除了需要衡量對象之間的距離之外,有些聚類算法(如層次聚類)還需要衡量cluster之間的距離 ,假設CiC_iCjC_j 爲兩個 cluster,則前四種方法定義的 CiC_iCjC_j 之間的距離如下表所示:

相似度度量準則 相似度度量函數
Single-link D(Ci,Cj)=minxCi,yCjd(x,y)D(C_i,C_j)= \min_{x\subseteq C_i, y\subseteq C_j}d( x, y)
Complete-link D(Ci,Cj)=maxxCi,yCjd(x,y)D(C_i,C_j)= \max_{x\subseteq C_i, y\subseteq C_j}d( x, y)
UPGMA D(Ci,Cj)=1CiCjxCi,yCjd(x,y)D(C_i,C_j)= \frac{1}{\left\| C_i\right \|\left \| C_j\right \|}\sum_{x\subseteq C_i, y\subseteq C_j}d( x, y)
WPGMA -
  • Single-link定義兩個cluster之間的距離爲兩個cluster之間距離最近的兩個點之間的距離,這種方法會在聚類的過程中產生鏈式效應,即有可能會出現非常大的cluster
  • Complete-link定義的是兩個cluster之間的距離爲兩個``cluster之間距離最遠的兩個點之間的距離,這種方法可以避免鏈式效應`,對異常樣本點(不符合數據集的整體分佈的噪聲點)卻非常敏感,容易產生不合理的聚類
  • UPGMA正好是Single-linkComplete-link方法的折中,他定義兩個cluster之間的距離爲兩個cluster之間所有點距離的平均值
  • 最後一種WPGMA方法計算的是兩個 cluster 之間兩個對象之間的距離的加權平均值,加權的目的是爲了使兩個 cluster 對距離的計算的影響在同一層次上,而不受 cluster 大小的影響,具體公式和採用的權重方案有關。

二、數據聚類方法

數據聚類方法主要可以分爲劃分式聚類方法(Partition-based Methods)基於密度的聚類方法(Density-based methods)層次化聚類方法(Hierarchical Methods)等。

image-20191110211430899

2.1 劃分式聚類方法

劃分式聚類方法需要事先指定簇類的數目或者聚類中心,通過反覆迭代,直至最後達到"簇內的點足夠近,簇間的點足夠遠"的目標。經典的劃分式聚類方法有k-means及其變體k-means++bi-kmeanskernel k-means等。

2.1.2 k-means算法

經典的k-means算法的流程如下:

  1. 創建kk個點作爲初始質心(通常是隨機選擇)
  2. 當任意一個點的簇分配結果發生改變時
    1. 對數據集中的每個數據點
      1. 對每個質心
        1. 計算質心與數據點之間的距離
      2. 將數據點分配到距其最近的簇
    2. 對每個簇,計算簇中所有點的均值並將均值作爲質心

經典k-means源代碼,下左圖是原始數據集,通過觀察發現大致可以分爲4類,所以取k=4k=4,測試數據效果如下右圖所示。
kmeans

test_animation

看起來很順利,但事情並非如此,我們考慮k-means算法中最核心的部分,假設xi(i=1,2,,n)x_i(i=1,2,…,n)是數據點,μj(j=1,2,,k)\mu_j(j=1,2,…,k)是初始化的數據中心,那麼我們的目標函數可以寫成
mini=1nminj=1,2,...,kxiμj2 \min\sum_{i=1}^{n} \min \limits_{j=1,2,...,k}\left |\left | x_i -\mu_j\right | \right |^2
這個函數是非凸優化函數,會收斂於局部最優解,可以參考證明過程。舉個🌰,μ1=[1,1],μ2=[1,1]\mu_1=\left [ 1,1\right ] ,\mu_2=\left [ -1,-1\right ],則
z=minj=1,2xiμj2 z=\min \limits_{j=1,2}\left |\left | x_i -\mu_j\right | \right |^2
該函數的曲線如下圖所示
局部最優

可以發現該函數有兩個局部最優點,當時初始質心點取值不同的時候,最終的聚類效果也不一樣,接下來我們看一個具體的實例。

劃分錯誤

在這個例子當中,下方的數據應該歸爲一類,而上方的數據應該歸爲兩類,這是由於初始質心點選取的不合理造成的誤分。而kk值的選取對結果的影響也非常大,同樣取上圖中數據集,取k=2,3,4k=2,3,4,可以得到下面的聚類結果:

k值不同

一般來說,經典k-means算法有以下幾個特點:

  1. 需要提前確定kk
  2. 對初始質心點敏感
  3. 對異常數據敏感

2.1.2 k-means++算法

k-means++是針對k-means中初始質心點選取的優化算法。該算法的流程和k-means類似,改變的地方只有初始質心的選取,該部分的算法流程如下

  1. 隨機選取一個數據點作爲初始的聚類中心
  2. 當聚類中心數量小於kk
    1. 計算每個數據點與當前已有聚類中心的最短距離,用D(x)D(x)表示,這個值越大,表示被選取爲下一個聚類中心的概率越大,最後使用輪盤法選取下一個聚類中心

k-means++源代碼,使用k-means++對上述數據做聚類處理,得到的結果如下

kpp_means

2.1.3 bi-kmeans算法

一種度量聚類效果的指標是SSE(Sum of Squared Error),他表示聚類後的簇離該簇的聚類中心的平方和,SSE越小,表示聚類效果越好。 bi-kmeans是針對kmeans算法會陷入局部最優的缺陷進行的改進算法。該算法基於SSE最小化的原理,首先將所有的數據點視爲一個簇,然後將該簇一分爲二,之後選擇其中一個簇繼續進行劃分,選擇哪一個簇進行劃分取決於對其劃分是否能最大程度的降低SSE的值。

該算法的流程如下:

  1. 將所有點視爲一個簇
  2. 當簇的個數小於kk
    1. 對每一個簇
      1. 計算總誤差
      2. 在給定的簇上面進行k-means聚類(k=2k=2)
      3. 計算將該簇一分爲二之後的總誤差
    2. 選取使得誤差最小的那個簇進行劃分操作

bi-kmeans算法源代碼,利用bi-kmeans算法處理上節中的數據得到的結果如下圖所示。

bi_kmeans

這是一個全局最優的方法,所以每次計算出來的SSE值肯定也是一樣的,我們和前面的k-meansk-means++比較一下計算出來的SSE

序號 k-means k-means++ bi-kmeans
1 2112 120 106
2 388 125 106
3 824 127 106
agv 1108 124 106

可以看到,k-means每次計算出來的SSE都較大且不太穩定,k-means++計算出來的SSE較穩定並且數值較小,而bi-kmeans每次計算出來的SSE都一樣(因爲是全局最優解)並且計算的SSE都較小,說明聚類的效果也最好。

2.2 基於密度的方法

k-means算法對於凸性數據具有良好的效果,能夠根據距離來講數據分爲球狀類的簇,但對於非凸形狀的數據點,就無能爲力了,當k-means算法在環形數據的聚類時,我們看看會發生什麼情況。

kmeans的侷限性

從上圖可以看到,kmeans聚類產生了錯誤的結果,這個時候就需要用到基於密度的聚類方法了,該方法需要定義兩個參數ε\varepsilonMM,分別表示密度的鄰域半徑和鄰域密度閾值。DBSCAN就是其中的典型。

2.2.1 DBSCAN算法

首先介紹幾個概念,考慮集合X={x(1),x(2),...,x(n)}X=\left \{x^{(1)},x^{(2)},...,x^{(n)}\right \}ε\varepsilon表示定義密度的鄰域半徑,設聚類的鄰域密度閾值爲MM,有以下定義:

  • ε\varepsilon鄰域(ε\varepsilon-neighborhood)

Nε(x)={yXd(x,y)<ε} N_{\varepsilon }(x)=\left \{y\in X|d(x, y) < \varepsilon \right \}

  • 密度(desity)
    xx的密度爲
    ρ(x)=Nε(x) \rho (x)=\left | N_{\varepsilon }(x)\right |

  • 核心點(core-point)

xXx\in X,若ρ(x)M\rho (x) \geq M,則稱xxXX的核心點,記XX中所有核心點構成的集合爲XcX_c,記所有非核心點構成的集合爲XncX_{nc}

  • 邊界點(border-point)

xXncx\in X_{nc},且yX\exists y\in X,滿足
yNε(x)Xc y\in N_{\varepsilon }(x) \cap X_c
xxε\varepsilon鄰域中存在覈心點,則稱xxXX的邊界點,記XX中所有的邊界點構成的集合爲XbdX_{bd}

此外,邊界點也可以這麼定義:若xXncx\in X_{nc},且xx落在某個核心點的ε\varepsilon鄰域內,則稱xxXX的一個邊界點,一個邊界點可能同時落入一個或多個核心點的ε\varepsilon鄰域。

  • 噪聲點(noise-point)

xx滿足
xX,xXcxXbd x\in X,x \notin X_{c}並且 x \notin X_{bd}
則稱xx爲噪聲點。

如下圖所示,設M=3M=3,則A爲核心點,B、C是邊界點,而N是噪聲點。

image-20191107094046177

該算法的流程如下:

  1. 標記所有對象爲unvisited
  2. 當有標記對象時
    1. 隨機選取一個unvisited對象pp
    2. 標記pp爲visited
    3. 如果pp的$\varepsilon 鄰域內至少有M$個對象,則
      1. 創建一個新的簇CC,並把pp放入CC
      2. NNpp的$\varepsilon 鄰域內的集合,對N中的每個點p’$
        1. 如果點pp'是unvisited
          1. 標記pp'爲visited
          2. 如果pp'的$\varepsilon 鄰域至少有M個對象,則把這些點添加到N$
          3. 如果pp'還不是任何簇的成員,則把pp'添加到CC
      3. 輸出CC
    4. 否則標記pp爲噪聲

構建ε\varepsilon鄰域的過程可以使用kd-tree進行優化,循環過程可以使用Numba、Cython、C進行優化DBSCAN源代碼,使用該節一開始提到的數據集,聚類效果如下
DBSCAN

聚類的過程示意圖

dbscan_process

當設置不同的ε\varepsilon時,會產生不同的結果,如下圖所示
dbscan_eps

當設置不同的MM時,會產生不同的結果,如下圖所示
dbscan_minpts
一般來說,DBSCAN算法有以下幾個特點:

  1. 需要提前確定ε\varepsilonMM
  2. 不需要提前設置聚類的個數
  3. 對初值選取敏感,對噪聲不敏感
  4. 對密度不均的數據聚合效果不好

2.2.2 OPTICS算法

DBSCAN算法中,使用了統一的ε\varepsilon值,當數據密度不均勻的時候,如果設置了較小的ε\varepsilon值,則較稀疏的cluster中的節點密度會小於MM,會被認爲是邊界點而不被用於進一步的擴展;如果設置了較大的ε\varepsilon值,則密度較大且離的比較近的cluster容易被劃分爲同一個cluster,如下圖所示。

image-20191113112338364

  • 如果設置的ε\varepsilon較大,將會獲得A,B,C這3個cluster
  • 如果設置的ε\varepsilon較小,將會只獲得C1、C2、C3這3個cluster

對於密度不均的數據選取一個合適的ε\varepsilon是很困難的,對於高維數據,由於維度災難(Curse of dimensionality),ε\varepsilon的選取將變得更加困難。

怎樣解決DBSCAN遺留下的問題呢?

The basic idea to overcome these problems is to run an algorithm which produces a special order of the database with respect to its density-based clustering structure containing the information about every clustering level of the data set (up to a “generating distance” ε\varepsilon), and is very easy to analyze.

即能夠提出一種算法,使得基於密度的聚類結構能夠呈現出一種特殊的順序,該順序所對應的聚類結構包含了每個層級的聚類的信息,並且便於分析。

OPTICS(Ordering Points To Identify the Clustering Structure, OPTICS)實際上是DBSCAN算法的一種有效擴展,主要解決對輸入參數敏感的問題。即選取有限個鄰域參數εi(0εiε)\varepsilon _i( 0 \leq\varepsilon_{i} \leq \varepsilon) 進行聚類,這樣就能得到不同鄰域參數下的聚類結果。

在介紹OPTICS算法之前,再擴展幾個概念。

  • 核心距離(core-distance)

樣本xXx∈X,對於給定的ε\varepsilonMM,使得xx成爲核心點的最小鄰域半徑稱爲xx的核心距離,其數學表達如下
cd(x)={UNDEFINED,Nε(x)<Md(x,NεM(x)),Nε(x)M cd(x)=\left\{\begin{matrix} UNDEFINED, \left | N_{\varepsilon }(x)\right |< M\\ d(x,N_{\varepsilon }^{M}(x)), \left | N_{\varepsilon }(x)\right | \geqslant M \end{matrix}\right.

其中,Nεi(x)N_{\varepsilon }^{i}(x)表示在集合Nε(x)N_{\varepsilon }(x)中與節點xxii近鄰的節點,如Nε1(x)N_{\varepsilon }^{1}(x)表示Nε(x)N_{\varepsilon }(x)中與xx最近的節點,如果xx爲核心點,則必然會有cd(x)εcd(x) \leq\varepsilon

  • 可達距離(reachability-distance)

x,yXx,y∈X,對於給定的參數ε\varepsilon和MMyy關於xx的可達距離定義爲
rd(y,x)={UNDEFINED,Nε(x)<Mmax{cd(x),d(x,y)},Nε(x)M rd(y,x)=\left\{\begin{matrix} UNDEFINED, \left | N_{\varepsilon }(x)\right |< M\\ \max{\{cd(x),d(x,y)\}}, \left| N_{\varepsilon }(x)\right | \geqslant M \end{matrix}\right.
特別地,當xx爲核心點時,可以按照下式來理解rd(x,y)rd(x,y)的含義
rd(x,y)=min{η:yNη(x)Nη(x)M} rd(x,y)=\min\{\eta:y \in N_{\eta}(x) 並且 \left|N_{\eta}(x)\right| \geq M\}
rd(x,y)rd(x,y)表示使得**“xx爲核心點"且"yyxx直接密度可達”**同時成立的最小鄰域半徑。

可達距離的意義在於衡量yy所在的密度,密度越大,他從相鄰節點直接密度可達的距離越小,如果聚類時想要朝着數據儘量稠密的空間進行擴張,那麼可達距離最小是最佳的選擇。

舉例,下圖中假設M=3M=3,半徑是εε。那麼PP點的核心距離是d(1,P)d(1,P),點2的可達距離是d(1,P)d(1,P),點3的可達距離也是d(1,P)d(1,P),點4的可達距離則是d(4,P)d(4,P)的距離。

img

OPTICS源代碼,算法流程如下:

  1. 標記所有對象爲unvisited,初始化order_list爲空
  2. 當有標記對象時
    1. 隨機選取一個unvisited對象ii
    2. 標記ii爲visited,插入結果序列order_list中
    3. 如果iiε\varepsilon鄰域內至少有MM個對象,則
      1. 初始化seed_list種子列表
      2. 調用insert_list(),將鄰域對象中未被訪問的節點按照可達距離插入隊列seeld_list中
      3. 當seed_list列表不爲空
        1. 按照可達距離升序取出seed_list中第一個元素jj
        2. 標記jj爲visited,插入結果序列order_list中
        3. 如果jjε\varepsilon鄰域內至少有MM個對象,則
          1. 調用insert_list(),將鄰域對象中未被訪問的節點按照可達距離插入隊列seeld_list中

算法中有一個很重要的insert_list()函數,這個函數如下:

  1. ii中所有的鄰域點kk
  2. 如果kk未被訪問過
    1. 計算rd(k,i)rd(k,i)
    2. 如果rk=UNDEFINEDr_k=UNDEFINED
      1. rk=rd(k,i)r_k=rd(k,i)
      2. 將節點kk按照可達距離插入seed_list中
    3. 否則
      1. 如果 rd(k,i)<rkrd(k,i)<r_k
      2. 更新rkr_k的值,並按照可達距離重新插入seed_list中

該算法最終獲取知識是一個輸出序列,該序列按照密度不同將相近密度的點聚合在一起,而不是輸出該點所屬的具體類別,如果要獲取該點所屬的類型,需要再設置一個參數ε(εε)\varepsilon'(\varepsilon' \leq \varepsilon)提取出具體的類別。這裏我們舉一個例子就知道是怎麼回事了。

隨機生成三組密度不均的數據,我們使用DBSCANOPTICS來看一下效果。

dbscan劃分不均勻數據

OPTICS

OPTICS算法輸出序列的過程:

optics_process

可見,OPTICS第一步生成的輸出序列較好的保留了各個不同密度的簇的特徵,根據輸出序列的可達距離圖,再設定一個合理的ε\varepsilon',便可以獲得較好的聚類效果。

2.3 層次化聚類方法

前面介紹的幾種算法確實可以在較小的複雜度內獲取較好的結果,但是這幾種算法卻存在一個鏈式效應的現象,比如:A與B相似,B與C相似,那麼在聚類的時候便會將A、B、C聚合到一起,但是如果A與C不相似,就會造成聚類誤差,嚴重的時候這個誤差可以一直傳遞下去。爲了降低鏈式效應,這時候層次聚類就該發揮作用了。

image-20191112172648420

層次聚類算法 (hierarchical clustering) 將數據集劃分爲一層一層的 clusters,後面一層生成的 clusters 基於前面一層的結果。層次聚類算法一般分爲兩類:

  • Agglomerative 層次聚類:又稱自底向上(bottom-up)的層次聚類,每一個對象最開始都是一個 cluster,每次按一定的準則將最相近的兩個 cluster 合併生成一個新的 cluster,如此往復,直至最終所有的對象都屬於一個 cluster。這裏主要關注此類算法。
  • Divisive 層次聚類: 又稱自頂向下(top-down)的層次聚類,最開始所有的對象均屬於一個 cluster,每次按一定的準則將某個 cluster 劃分爲多個 cluster,如此往復,直至每個對象均是一個 cluster

hierarchical_clustering

另外,需指出的是,層次聚類算法是一種貪心算法(greedy algorithm),因其每一次合併或劃分都是基於某種局部最優的選擇。

2.3.1 Agglomerative算法

給定數據集 X={x(1),x(2),...,x(n)}X=\left \{x^{(1)},x^{(2)},...,x^{(n)}\right \}Agglomerative層次聚類最簡單的實現方法分爲以下幾步:

  1. 初始時每個樣本爲一個 cluster,計算距離矩陣 DD,其中元素DijD_{ij}爲樣本點DiD_iDjD_j 之間的距離;
  2. 遍歷距離矩陣 DD,找出其中的最小距離(對角線上的除外),並由此得到擁有最小距離的兩個 cluster 的編號,將這兩個 cluster 合併爲一個新的 cluster 並依據 cluster距離度量方法更新距離矩陣DD(刪除這兩個 cluster 對應的行和列,並把由新 cluster 所算出來的距離向量插入 DD中),存儲本次合併的相關信息;
  3. 重複 2 的過程,直至最終只剩下一個 cluster

Agglomerative算法源代碼,可以看到,該 算法的時間複雜度爲 O(n3)O(n^3) (由於每次合併兩個 cluster 時都要遍歷大小爲 O(n2)O(n^2)的距離矩陣來搜索最小距離,而這樣的操作需要進行n1n−1 次),空間複雜度爲O(n2)O(n^2) (由於要存儲距離矩陣)。

層次

上圖中分別使用了層次聚類中4個不同的cluster度量方法,可以看到,使用single-link確實會造成一定的鏈式效應,而使用complete-link則完全不會產生這種現象,使用average-linkward-link則介於兩者之間。

2.4 聚類方法比較

算法類型 適合的數據類型 抗噪點性能 聚類形狀 算法效率
kmeans 數值型 較差 球形 很高
k-means++ 數值型 一般 球形 較高
bi-kmeans 數值型 一般 球形 較高
DBSCAN 數值型 較好 任意形狀 一般
OPTICS 數值型 較好 任意形狀 一般
Ag glomerative 混合型 較好 任意形狀 較差

三、參考文獻

[1] 李航.統計學習方法

[2] Peter Harrington.Machine Learning in Action/李銳.機器學習實戰

[3] https://www.zhihu.com/question/34554321

[4] T. Soni Madhulatha.AN OVERVIEW ON CLUSTERING METHODS

[5] https://zhuanlan.zhihu.com/p/32375430

[6] http://heathcliff.me/聚類分析(一):層次聚類算法

[7] https://www.cnblogs.com/tiaozistudy/p/dbscan_algorithm.html

[8] https://blog.csdn.net/itplus/article/details/10089323

[9] Mihael Ankerst.OPTICS: ordering points to identify the clustering structure

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章