【機器學習】--層次聚類從初識到應用

LHBlog發表於2018-04-06

一、前述

聚類就是對大量未知標註的資料集,按資料的內在相似性將資料集劃分為多個類別,使類別內的資料相似度較大而類別間的資料相似度較小.

資料聚類演算法可以分為結構性或者分散性,許多聚類演算法在執行之前,需要指定從輸入資料集中產生的分類個數。

1.分散式聚類演算法,是一次性確定要產生的類別,這種演算法也已應用於從下至上聚類演算法。

2.結構性演算法利用以前成功使用過的聚類器進行分類,而分散型演算法則是一次確定所有分類。

結構性演算法可以從上至下或者從下至上雙向進行計算。從下至上演算法從每個物件作為單獨分類開始,不斷融合其中相近的物件而從上至下演算法則是把所有物件作為一個整體分類,然後逐漸分小。

3.基於密度的聚類演算法,是為了挖掘有任意形狀特性的類別而發明的。此演算法把一個類別視為資料集中大於某閾值的一個區域。DBSCAN和OPTICS是兩個典型的演算法。

4.層次聚類,是一種很直觀的演算法。顧名思義就是要一層一層地進行聚類,可以由上向下把大的類別(cluster)分割,叫作分裂法;也可以由下向上對小的類別進行聚合,叫作凝聚法;但是一般用的比較多的是由下向上的凝聚方法。

二、具體

1、大致過程:

層次聚類方法對給定的資料集進行層次的分解,直到某種條件滿足為止。
在已經得到距離值之後,元素間可以被聯絡起來。通過分離和融合可以構建一個結構。傳統上,表示的方法是樹形資料結構,

層次聚類演算法要麼是自底向上聚集型的,即從葉子節點開始,最終匯聚到根節點;要麼是自頂向下分裂型的,即從根節點開始,遞迴的向下分裂。

 

2、凝聚層次聚類:

首先將每個物件作為一個簇,然後合併這些原子簇為越來越大的簇,直到某個終結條件被滿足。

AGNES演算法(自底向上)(用的多些)

所謂從下而上地合併cluster,具體而言,就是每次找到距離最短的兩個cluster,然後進行合併成一個大的cluster,直到全部合併為一個cluster

整個過程就是建立一個樹結構,類似於下圖。

一開始每個資料點獨自作為一個類,它們的距離就是這兩個點之間的距離。而對於包含不止一個資料點的cluster,就可以選擇多種方法了。最常用的,就是average-linkage,即計算兩個cluster各自資料點的兩兩距離的平均值。

 

 

凝聚法指的是初始時將每個樣本點當做一個類簇,所以原始類簇的大小等於樣本點的個數,然後依據某種準則合併這些初始的類簇,直到達到某種條件或者達到設定的分類數目。

用演算法描述:

       輸入:樣本集合D,聚類數目或者某個條件(一般是樣本距離的閾值,這樣就可不設定聚類數目)
       輸出:聚類結果

舉例如下:

在平面上有6個點:p0(1,1), p1(1,2), p2(2,2), p3(4,4), p4(4,5), p5(5,6),我現在需要對這6個點進行聚類,對應著上邊的步驟我可以這樣做:



      1.首先每個樣本看作是一個類簇,這樣我可以得到初始的類簇有6個,分別為c1(p0),c2(p1),c3(p2),c4(p3),c5(p4),c6(p5)
       repeat:
       2.由上邊的表可以得到兩兩類簇間的最小距離(並不是唯一,其他兩個類簇間距離也可能等於最小值,但是先選取一個)是1,存在類簇c1和c2之間
       注意:這個類簇間距離的計算方法有許多種。
          (1).就是取兩個類中距離最近的兩個樣本的距離作為這兩個集合的距離,也就是說,最近兩個樣本之間的距離越小,這兩個類之間的相似度就越大
          (2).取兩個集合中距離最遠的兩個點的距離作為兩個集合的距離
          (3).把兩個集合中的點兩兩的距離全部放在一起求一個平均值,相對也能得到合適一點的結果。
          (4).取兩兩距離的中值,與取均值相比更加能夠解除個別偏離樣本對結果的干擾。
          (5).把兩個集合中的點兩兩的距離全部放在一起求和然後除以兩個集合中的元素個數
          (6).求每個集合的中心點(就是將集合中的所有元素的對應維度相加然後再除以元素個數得到的一個向量),然後用中心點代替集合再去就集合間的距離


       3.合併類簇c1和c2,得到新的聚類結果c1(p0,p1),c3(p2),c4(p3),c5(p4),c6(p5)。
       util:若是我們要求聚成5個類別的話,我們這裡就可以結束了。

    但是如果我們設定了一個閾值f,要求若存在距離小於閾值f的兩個類簇時則將兩個類簇合並並且繼續迭代,我們又會回到repeat繼續迭代從而得到新的聚類結果。

3、分裂層次聚類:

DIANA演算法(自頂向下)

首先將所有物件置於一個簇中,然後逐漸細分為越來越小的簇,直到達到了某個終結條件。

分裂法指的是初始時將所有的樣本歸為一個類簇,然後依據某種準則進行逐漸的分裂,直到達到某種條件或者達到設定的分類數目。用演算法描述:

    輸入:樣本集合D,聚類數目或者某個條件(一般是樣本距離的閾值,這樣就可不設定聚類數目)

    輸出:聚類結果

    1.將樣本集中的所有的樣本歸為一個類簇;

    repeat:

     2.在同一個類簇(計為c)中計算兩兩樣本之間的距離,找出距離最遠的兩個樣本a,b;

     3.將樣本a,b分配到不同的類簇c1和c2中;

      4.計算原類簇(c)中剩餘的其他樣本點和a,b的距離,若是dis(a)<dis(b),則將樣本點歸到c1中,否則歸到c2中;

    util: 達到聚類的數目或者達到設定的條件

 

相關文章