本文介紹了聚類演算法,內容包括K-means、Fuzzy C-means、 Hierarchical 、Mixture of Gaussians 。
原文鏈接:聚類演算法入門教程
感謝社區用戶Vivian對本文的貢獻!
目錄
聚類是什麼? 聚類是一種涉及數據點分組的機器學習技術。
給定一組數據點,我們可以使用聚類演算法將每個數據點分類到特定的組中。理論上,同一組中的數據點應具有相似的屬性或特徵,而不同組中的數據點應具有較大差異的屬性或特徵。
聚類是無監督學習的一種方法,也是用於許多領域中統計數據分析的常用技術。 我們可以用一個簡單的圖形例子來說明:
相似性的標準是距離:如果兩個或多個物體根據給定的距離(在本例中是幾何距離)「接近」,則它們屬於同一簇。這稱為基於距離的聚類。
另一種聚類是概念聚類:兩個或多個對象屬於同一個簇,如果這個簇定義了所有這些對象共有的概念。換句話說,對象是根據它們對描述性概念的適合程度來分組的,而不是根據簡單的相似性度量。
聚類的目標是確定一組未標記數據中的固有分組。但是如何決定什麼構成一個好的簇呢?可以看出,並沒有絕對的「最佳」標準,它獨立於聚類的最終目標。因此,用戶必須提供這個標準,以便聚類的結果能夠滿足他們的需要。
聚類演算法可以應用於很多領域,例如:
聚類演算法需要滿足的主要要求是:
所謂聚類問題,就是給定一個元素集合D,其中每個元素具有n個可觀察屬性,使用某種演算法將D劃分成k個子集,要求每個子集內部的元素之間相異度儘可能低,而不同子集的元素相異度儘可能高。其中每個子集叫做一個簇。
聚類演算法可以分為以下幾種:
1.在第一種情況下,數據以排他性的方式分組,因此,如果某個數據屬於某個簇,那麼它就不能包含在另一個簇中。一個簡單的例子如下圖所示,點的分離是通過二維平面上的一條直線實現的。
3.Hierarchical Clustering演算法是基於兩個最近的簇之間的並集。先把每個點都看作一個簇,然後再把最近的兩個簇聚合成為一個新的簇,如此這般,不斷迭代,直到滿足最後設定的要求。
4.Probabilistic Clustering使用完全概率的方法。
在本教程中,我們提出了四種最常用的聚類演算法:
這些演算法都屬於上面列出的一種聚類類型。因此,k均值是Exclusive Clustering演算法,模糊c均值是Overlapping Clustering演算法,層次聚類屬於Hierarchical Clustering演算法,高斯混合模型屬於Probabilistic Clustering演算法。我們將在下文中討論每一種聚類方法。
聚類演算法的一個重要內容是數據點之間的距離度量。 如果數據實例向量都在相同的物理單元中,那麼簡單的歐式距離度量就有可能足以成功地對相似的數據實例進行分組。然而,即使在這種情況下,歐式距離有時也會產生誤導。
在下圖中,左圖height刻度每單位0.25,與縱坐標相同,看起來分成上下兩組剛剛好。然而,如果通過重新調整坐標,將橫坐標做拉伸處理,將每單位定義成0.125,肉眼看起來分成左右兩組才更合適了。在左右兩種聚類方式中,點的坐標沒有變,唯一改變的就是橫坐標比例。而就因為如此,分組方式完全變了。
聚類聚得「好不好」,通常無法用絕對值來衡量,主要還是看你的目標是什麼,也就是為何聚類。 同樣,我們需要藉助相關領域的知識來指導如何為每個特定應用制定適當的距離度量。
對於高維數據,最常用的測量方法是閔可夫斯基度規:
然而,對於為指定的應用選擇度量標準並沒有通用的理論。 通常情況下,數據特徵向量的組成部分不能直接進行比較。它可能不是連續變數(如長度),而是名義類別(如星期幾)。
在這些情況下,必須再次憑藉相關領域的知識來制定適當的度量。
K-means (MacQueen, 1967)是最簡單的非監督學習演算法之一,解決了眾所周知的聚類問題。該過程遵循一種簡單易行的方法,通過一定數量的簇(假設k個簇)對給定的數據集進行分類。
K-Means演算法的思想很簡單,對於給定的樣本集,按照樣本之間的距離大小,將樣本集劃分為K個簇。讓簇內的點盡量緊密的連在一起,而讓簇間的距離盡量的大。
該演算法的目標是最小化目標函數,在本例中是平方誤差函數。 目標函數:
演算法由以下步驟組成:
雖然可以證明過程總是可以終止的,但是k-means演算法不一定能找到最優的配置,對應的是全局目標函數的最小值。 該演算法對初始隨機選擇的聚類中心也具有顯著的敏感性。k-means演算法可以多次運行以減少這種影響。 K-means是一種簡單的演算法,適用於許多問題領域。正如我們將要看到的,它非常適合處理模糊特徵向量。
假設我們有n個樣本特徵向量 都來自同一個類,我們知道它們屬於 個緊簇, ,設 為簇 中向量的均值,如果簇之間的距離很好,我們可以使用最小距離分類器將它們分離。也就是說,如果 是所有 個距離的最小值,我們可以說 在簇 中。求 的方法如下:
下面是一個例子,說明均值 和 如何移動到兩個集群的中心。
這是k-means程序的一個簡單版本。它可以看作是一種貪婪演算法,將n個樣本劃分為k個簇,從而最小化到簇中心距離的平方和。它確實有一些缺點:
最後一個問題特別麻煩,因為我們通常無法知道存在多少個簇。在上面的例子中,相同的演算法應用於相同的數據,會產生以下3種聚類方法。它比2均值聚類更好還是更差呢?
Fuzzy C-Means (FCM)是一種聚類方法,它允許一段數據屬於兩個或更多的聚類。這種方法(Dunn在1973年開發,Bezdek在1981年改進)經常用於模式識別。它基於以下目標函數的最小化:
對上述目標函數進行迭代優化,對隸屬度 和聚類中心 進行更新,進行模糊劃分:
為了更好地理解,我們可以參考一個簡單的一維示例。 給定一個數據集,假設將其表示為分布在軸上。如下圖所示:
看這幅圖,我們可以在兩個數據集中附近找到兩個簇。我們將用「A」和「B」來指代它們。在本教程中展示的第一種方法k-means演算法—中,我們將每個數據關聯到一個特定的質心;因此,這個隸屬度函數是這樣的:
相反,在FCM方法中,相同的給定數據並不完全屬於定義良好的簇,但是可以將其放在中間位置。在這種情況下,隸屬度函數沿著一條更平滑的線表示每個數據可能屬於幾個具有不同隸屬度係數值的簇。
在上圖中,以紅色標記的點表示的數據更多的屬於B簇,而不是A簇。值「m」=0.2表示該數據到A的隸屬度。現在,我們不使用圖形表示,我們引入一個矩陣U,其因子是從隸屬函數中提取的:
行和列的數量取決於我們正在考慮的數據和簇的數量。更準確地說,我們有C = 2列(C = 2個簇)和N行,其中C是簇的總數,N是數據的總數。通用元素是這樣表示的:uij。 在上面的例子中,我們考慮了k均值(a)和FCM (b)的情況。我們可以注意到在第一種情況下(a)係數總是單一的。這樣做是為了表明每個數據只能屬於一個簇。其他屬性如下所示:
4.2 示例
在這裡,我們考慮FCM的一維應用程序的簡單情況。20個數據和3個簇用於初始化演算法和計算U矩陣。下圖(取自我們的互動式演示)顯示了每個數據和每個簇的成員資格值。根據隸屬度函數,數據的顏色是最近的簇的顏色。
在上圖所示的模擬中,我們使用了一個模糊係數 ,並且當 時強制終止演算法。圖中顯示了模糊分布依賴於聚類特定位置的初始條件。還沒有執行任何步驟,因此不能很好地標識簇。現在我們可以運行該演算法,直到停止條件得到驗證。下表為第8步得到的最終條件, :
有可能做得更好嗎?當然,我們可以使用更高的精度,但我們也必須投入更大的計算量。在下一個圖中,我們可以看到使用相同的初始條件和 得到了更好的結果,但是我們需要37個步驟!
同樣需要注意的是,不同的初始化會導致演算法的不同演進。事實上,它可以收斂到相同的結果,但可能需要不同數量的迭代步驟。
給定一組要聚類的N個項,以及一個N*N的距離(或相似性)矩陣,層次聚類的基本過程(1967年S.C. Johnson定義)為:
步驟3可以通過不同的方式來完成,這就是單連鎖(single-linkage)與完全連鎖(complete-linkage)和平均連鎖(average-linkage)聚類的區別所在。
average-linkage聚類的一種變化是R.DAndrade(1978)的UCLUS方法,它使用中值距離,它比平均距離更具異常性。
這種層次聚類被稱為聚合聚類,因為它是迭代地合併簇。還有一種分裂的層次聚類,它從一個簇中的所有對象開始,並將它們細分為更小的部分,從而實現相反的效果。分裂的方法一般是不可用的,也很少得到應用。
當然,將所有N個項目分組在一個簇中是沒有意義的,但是,一旦你獲得了完整的層次樹,如果想要k個簇,只需刪除k-1最長的鏈接。
現在讓我們更深入地看看Johnson演算法在Single-Linkage聚類情況下是如何工作的。
該演算法是一種新的聚類演算法,當舊的聚類被合併到新的聚類中時,該演算法將消除鄰近矩陣中的行和列。
N*N鄰近矩陣 。聚類的序列編號為 和 為第 個聚類層次。序號為 的簇記為 ,簇 與簇 的鄰近度記為 。 演算法由以下步驟組成:
1、首先以級別 的不相交聚類開始。 2、根據 ,找出當前聚類中最不相似的對,即對 。其中最小值為當前簇中的所有對簇。 3、增加序號: 。將聚類 和 合併到單個聚類中,形成下一個聚類 。將該聚類的級別設置為 4、更新鄰近矩陣 ,刪除與簇 和 對應的行和列,並添加與新形成的簇對應的行和列。新簇 與舊簇 的鄰近度定義如下: 5、如果所有對象都在一個簇中,則停止。否則,轉到步驟2。
1、首先以級別 的不相交聚類開始。
現在讓我們看一個簡單的例子:一些義大利城市之間以公里為單位的距離的層次聚類。使用的方法是Single-Linkage 。 輸入距離矩陣 :
最近的兩個城市是MI和TO,距離138。它們被合併到一個名為「MI/TO」的簇中。新簇的級別為L(MI/TO) = 138,新序列號為m = 1。
然後我們計算這個新的複合對象到所有其他對象的距離。在單鏈路聚類中,規則是複合對象到另一個對象的距離等於從簇中的任何成員到外部對象的最短距離。因此,從MI/到RM的距離被選擇為564,也就是從MI到RM的距離,以此類推。
將MI與合併後得到如下矩陣:
=>將NA和RM合併成一個新的簇NA/RM
=>將BA和NA/RM合併到一個名為BA/NA/RM的新簇中
=>將BA/NA/RM與FI合併成一個新的簇BA/FI/NA/RM
最後,我們在295級合併最後兩個簇。 該過程總結為以下層次樹:
聚類方法的主要缺點是:
還有另一種處理聚類問題的方法:基於模型的方法,其中包括使用某些模型進行聚類並嘗試優化數據和模型之間的擬合。 在實踐中,每個聚類可以通過參數分布在數學上表示,如高斯(連續)或泊松(離散)。因此,整個數據集由這些分布的混合物建模。用於對特定簇建模的單個分布通常稱為組件分布。
具有高可能性的混合模型傾向於具有以下特徵:
基於模型聚類的主要優點:
這類聚類方法中應用最廣泛的是一種基於高斯混合學習的聚類方法:我們實際上可以把聚類看作是以其質心為中心的高斯分布,如圖所示,其中灰色圓圈表示分布的第一個方差:
演算法是這樣工作的:
我們假設有:
我們可以得到樣本的概率: 我們真正想要的是最大化是 (給定高斯中心的基準概率)
在實際應用中,用來尋找對數據集建模的高斯混合的演算法稱為EM (expectzation, Dempster, Laird and Rubin, 1977)。讓我們看一個例子。 假設xk是某門課的學生得到的分數,其概率為:
通過計算 使這個函數最大化。我們來計算函數的對數,並使其最大化:
假設a = 14, b = 6, c = 9, d = 10,我們可以計算出μ=110。
這樣我們就得到了一個循環,它分為兩個步驟:
這種循環性可以用迭代的方法求解。
現在我們來看看EM演算法是如何適用於混合高斯函數的(在第p次迭代中估計的參數用上標(p)標記):
1、參數初值:
2、求期望:
其中R是記錄的個數。