1. 程式人生 > >一文盤點5種聚類演算法,資料科學家必備!

一文盤點5種聚類演算法,資料科學家必備!

聚類是一種將資料點按一定規則分群的機器學習技術。

給定一組資料點,我們可以使用聚類演算法將每個資料點分類到一個特定的簇中。理論上,屬於同一類的資料點應具有相似的屬性或特徵,而不同類中的資料點應具有差異很大的屬性或特徵。

聚類屬於無監督學習中的一種方法,也是一種在許多領域中用於統計資料分析的常用技術。

一、K-均值聚類

K-Means可能是最知名的聚類演算法,沒有之一。並且該演算法的程式碼很容易理解和實現!你可以通過看下面的插圖來理解它。

1. 首先,我們選擇一些要使用的類/組,並隨機初始化他們各自的中心點(質心)。要計算出簇(類)的使用數量,最好的方法是快速檢視一下資料並嘗試鑑別有多少不同的分組。

中心點是一個向量,它到每個資料點的向量長度相同,在上圖中用“X”來表示。

2. 每個資料點通過計算該點與每個簇中心之間的距離來進行分類,根據最小距離,將該點分類到對應中心點的簇中。

3. 根據這些已分類的點,我們重新計算簇中所有向量的均值,來確定新的中心點。

4. 重複以上步驟來進行一定數量的迭代,或者直到簇中心點在迭代之間變化不大。你也可以選擇多次隨機初始化簇中心點,然後選擇看起來像是最佳結果的資料,再來重複以上步驟。

K-Means演算法的優勢在於它的速度非常快,因為我們所做的只是計算點和簇中心之間的距離; 這已經是非常少的計算了!因此它具有線性的複雜度O(n)。

但是,K-Means演算法也是有一些缺點。首先,你必須手動選擇有多少簇。

這是一個很大的弊端,理想情況下,我們是希望能使用一個聚類演算法來幫助我們找出有多少簇,因為聚類演算法的目的就是從資料中來獲得一些有用資訊。

K-means演算法的另一個缺點是從隨機選擇的簇中心點開始執行,這導致每一次執行該演算法可能產生不同的聚類結果。

因此,該演算法結果可能具有不可重複,缺乏一致性等性質。而其他聚類演算法的結果則會顯得更一致一些。
K-Medians是與K-Means類似的另一種聚類演算法,它是通過計算類中所有向量的中值,而不是平均值,來確定簇的中心點。

這種方法的優點是對資料中的異常值不太敏感,但是在較大的資料集時進行聚類時,速度要慢得多,造成這種現象的原因是這種方法每次迭代時,都需要對資料進行排序。

二、Mean-Shift聚類演算法

Mean-Shift是一種基於滑動視窗的聚類演算法。也可以說它是一種基於質心的演算法,這意思是它是通過計算滑動視窗中的均值來更新中心點的候選框,以此達到找到每個簇中心點的目的。然後在剩下的處理階段中,對這些候選視窗進行濾波以消除近似或重複的視窗,找到最終的中心點及其對應的簇。看看下面的圖解。

用於單個滑動視窗的Mean-Shift聚類演算法

1. 為了闡釋Mean-shift演算法,我們可以考慮二維空間中的一組點,如上圖所示。我們從一個以C點(隨機選擇)為中心,以半徑r為核心的圓滑動視窗開始。Mean-shift可以看作是一種等高線演算法,在每次迭代中,它能將核函式(圓滑動視窗)移動到每個迭代中較高密度的區域,直至收斂。


2. 在每次迭代中,通過將中心點移動到視窗內點的平均值處(因此得名),來使滑動視窗移向更高密度的區域。滑動視窗內的資料密度與其內部點的數目成正比。當然,通過移動視窗中點的平均值,它(滑動視窗)就會逐漸移向點密度更高的區域。


3. 我們繼續根據平均值來移動滑動視窗,直到不能找到一個移動方向,使滑動視窗可以容納更多的點。看看上面圖片的動畫效果;直到滑動視窗內不再增加密度(即視窗中的點數),我們才停止移動這個圓圈。


4. 步驟1至步驟3的過程是由許多滑動視窗來完成的,直到所有的點都能位於對應視窗內時才停止。當多個滑動視窗重疊時,該演算法就保留包含最多點的視窗。最終所有資料點根據它們所在的滑動視窗來確定分到哪一類。


下圖顯示了所有滑動視窗從頭到尾的整個移動過程。每個黑點代表滑動視窗的質心,每個灰點代表一個數據點。

Mean-Shift聚類的整個過程

與K-means聚類演算法相比,Mean-shift演算法是不需要選擇簇的數量,因為它是自動找尋有幾類。這是一個相比其他演算法巨大的優點。而且該演算法的聚類效果也是非常理想的,在自然資料驅動的情況下,它能非常直觀的展現和符合其意義。演算法的缺點是固定了視窗大小/半徑“r”。

三、基於密度的噪聲應用空間聚類(DBSCAN)

DBSCAN是一種基於密度的聚類演算法,類似於Mean-shift演算法,但具有一些顯著的優點。我們從看下面這個奇特的圖形開始瞭解該演算法。

DBSCAN笑臉人臉聚類

1. DBSCAN演算法從一個未被訪問的任意的資料點開始。這個點的鄰域是用距離epsilon來定義(即該點ε距離範圍內的所有點都是鄰域點)

2. 如果在該鄰域內有足夠數量的點(根據minPoints的值),則聚類過程開始,並且當前資料點成為新簇中的第一個點。否則,該點將被標記為噪聲(稍後,這個噪聲點可能成為聚類中的一部分)。在這兩種情況下,該點都會被標記為“已訪問”。


3. 對於新簇中的第一個點,它的ε距離鄰域內的點也會成為同簇的一部分。這個過程使ε鄰域內的所有點都屬於同一個簇,然後對才新增到簇中的所有新點重複上述過程。

4. 重複步驟2和3兩個過程直到確定了聚類中的所有點才停止,即訪問和標記了聚類的ε鄰域內的所有點。

5. 一旦我們完成了當前的聚類,就檢索和處理新的未訪問的點,就能進一步發現新的簇或者是噪聲。重複上述過程,直到所有點被標記為已訪問才停止。由於所有點已經被訪問完畢,每個點都被標記為屬於一個簇或是噪聲。

與其他聚類演算法相比,DBSCAN具有很多優點。首先,它根本不需要確定簇的數量。不同於Mean-shift演算法,當資料點非常不同時,會將它們單純地引入簇中,DBSCAN能將異常值識別為噪聲。另外,它能夠很好地找到任意大小和任意形狀的簇。

DBSCAN演算法的主要缺點是,當資料簇密度不均勻時,它的效果不如其他演算法好。這是因為當密度變化時,用於識別鄰近點的距離閾值ε和minPoints的設定將隨著簇而變化。在處理高維資料時也會出現這種缺點,因為難以估計距離閾值ε。

 

四、使用高斯混合模型(GMM)的期望最大化(EM)聚類

K-Means演算法的主要缺點之一就是它對於聚類中心平均值的使用太單一。

通過檢視下面的圖例,我們可以明白為什麼它不是使用均值最佳的方式。

在左側,人眼看起來非常明顯的是,具有相同均值的資料中心點,卻是不同半徑長度的兩個圓形簇。

而K-Means演算法不能解決這樣的資料問題,因為這些簇的均值是非常接近的。K-Means演算法在簇不是圓形的情況下也一樣無效,也是由於使用均值作為叢集中心。

K-Means演算法兩個失敗的案例

相較於K-means演算法,高斯混合模型(GMMs)能處理更多的情況。對於GMM,我們假設資料點是高斯分佈的; 這是一個限制較少的假設,而不是用均值來表示它們是圓形的。這樣,我們有兩個引數來描述簇的形狀:即均值和標準差!以二維為例,這意味著這些簇可以是任何型別的橢圓形(因為GMM在x和y方向上都有標準偏差)。因此,每個高斯分佈都被單個簇所指定。

為了找到每個簇的高斯引數(例如平均值和標準差),我們將使用期望最大化(EM)的優化演算法。請看下面的圖表,可以作為匹配簇的高斯圖的闡釋。然後我們來完成使用GMM的期望最大化聚類過程。

使用GMM的EM聚類

1. 我們首先選擇簇的數量(如K-Means),然後隨機初始化每個簇的高斯分佈引數。可以通過快速檢視資料的方式,來嘗試為初始引數提供一個較好的猜測。不過請注意,從上圖可以看出,這不是100%必要的,因為即使是從一個很差的高斯分佈開始,演算法也能很快的優化它。

2. 給定每個簇的高斯分佈,計算每個資料點屬於特定簇的概率。一個點越靠近高斯的中心,它越可能屬於該簇。在使用高斯分佈時這應該是非常直觀的,因為我們假設大部分資料更靠近簇的中心。

3. 基於這些概率,我們為高斯分佈計算一組新的引數,使得我們能最大化簇內資料點的概率。我們使用資料點位置的加權和來計算這些新引數,其中權重是資料點屬於該特定簇的概率。為了更直觀的解釋這個,我們可以看看上面的圖片,特別是黃色的簇。

第一次迭代時,分佈是隨機開始,但是我們可以看到大部分黃點都在分佈的右側。當我們計算按概率加權的和時,即使中心附近的點大部分都在右邊,通過分配的均值自然就會接近這些點。我們也可以看到,大部分資料點都是“從右上到左下”。因此,改變標準差的值,可以找到一個更適合這些點的橢圓,以最大化概率加權的總和。

4. 重複迭步驟2和3,直到收斂,也就是分佈在迭代中基本再無變化。

使用GMM方法有兩個很重要的優點。 首先,GMM方法在聚類協方差上比K-Means靈活得多; 由於使用了標準偏差引數,簇可以呈現任何橢圓形狀,而不是被限制為圓形。 K-mean演算法實際上是GMM的一個特殊情況,即每個簇的協方差在所有維度上都接近0。其次,由於GMM使用了概率,每個資料點可以有多個簇。因此,如果一個數據點位於兩個重疊的簇的中間,我們可以簡單地定義它的類,即屬於類1的概率是百分之X,屬於類2的概率是百分之Y。即,GMM支援混合類這種情況。

 

五、凝聚層次聚類

分層聚類演算法實際上分為兩類:

  • 自上而下

  • 自下而上

自下而上的演算法首先將每個資料點視為一個單一的簇,然後連續地合併(或聚合)成對的簇,直到所有的簇都合併成一個包含所有資料點的簇。

因此,自下而上的分層聚類被稱為合成聚類或HAC。

這個簇的層次可以用樹(或樹狀圖)表示。樹的根是收集所有樣本的唯一簇,葉是僅具有一個樣本的簇。

在進入演算法步驟之前,請檢視下面的圖解。

合成聚類

1. 我們首先將每個資料點視為一個單一的簇,即如果我們的資料集中有X個數據點,那麼我們就有X個簇。然後,我們選擇一個距離度量,來度量兩個簇之間距離。作為一個例子,我們將使用平均關聯度量,它將兩個簇之間的距離定義為第一個簇中的資料點與第二個簇中的資料點之間的平均距離。

2. 在每次迭代中,我們將兩個簇合併成一個簇。選擇平均關聯值最小的兩個簇進行合併。根據我們選擇的距離度量,這兩個簇之間的距離最小,因此是最相似的,所有應該合併。

3. 重複步驟2直到我們到達樹的根,即我們只有一個包含所有資料點的簇。通過這種方式,我們可以選擇最終需要多少個簇。方法就是選擇何時停止合併簇,即停止構建樹時!

分層次聚類不需要我們指定簇的數量,我們甚至可以在構建樹的同時,選擇一個看起來效果最好的簇的數量。

另外,該演算法對距離度量的選擇並不敏感,與其他距離度量選擇很重要的聚類演算法相比,該演算法下的所有距離度量方法都表現得很好。

當基礎資料具有層次結構,並且想要恢復層次結構時,層次聚類演算法能實現這一目標;而其他聚類演算法則不能做到這一點。

與K-Means和GMM的線性複雜性不同,層次聚類的這些優點是以較低的效率為代價,即它具有O(n3)的時間複雜度。