圖解機器學習 | 聚類算法詳解


showmeai研究中心

作者:韓信子@ShowMeAI
教程地址https://www.showmeai.tech/tutorials/34
本文地址https://www.showmeai.tech/article-detail/197
聲明:版權所有,轉載請聯系平台與作者並注明出處


引言

聚類(Clustering)是最常見的無監督學習算法,它指的是按照某個特定標准(如距離)把一個數據集分割成不同的類或簇,使得同一個簇內的數據對象的相似性盡可能大,同時不在同一個簇中的數據對象的差異性也盡可能地大。也即聚類后同一類的數據盡可能聚集到一起,不同類數據盡量分離。

聚類算法在很多場景下都有應用,例如新聞自動分組,用戶分群,圖像分割等等。很多時候,無監督的聚類算法,得到的聚類結果還可以作為特征在后續監督學習中應用,提升整體效果。本篇內容ShowMeAI帶大家一起來學習一下聚類算法。

(本篇聚類算法部分內容涉及到機器學習基礎知識,沒有先序知識儲備的寶寶可以查看ShowMeAI的文章 圖解機器學習 | 機器學習基礎知識

1.聚類問題

1)聚類問題與核心概念

俗話說人以類聚物以群分,聚類算法做的事情,就是對無標簽的數據,基於數據分布進行分群分組,使得相似的數據盡量落在同一個簇內。

我們先對比區分一下聚類和分類

  • 聚類是一種無監督學習,而分類是一種有監督的學習。
  • 聚類只需要人工指定相似度的標准和類別數就可以,而分類需要從訓練集學習分類的方法。

2)聚類算法用途

聚類算法應用非常廣泛。在面對未知的世界時,先分類,再逐個研究,是人類探索未知世界的一個基本方法。聚類算法可以應用於探索性數據挖掘、統計分析、生物信息學、數據壓縮、計算機圖像識別、醫學影像分析等,在商業領域可以用來做市場研究、商品歸類,在社會科學領域可以用來做犯罪區域分析等等。

下圖中有一些樣本點,我們根據物理距離的遠近,把所有的點分成3類。你只需要告訴算法這些信息,算法就可以按照你的要求完成聚類:

  • 分類數量為3;
  • 分類標准是物理距離;
  • 分好的類分別用紅、綠、藍表示。

實際上,除了物理距離,現實生活中任何你能想到、計算機可以通過運算和邏輯進行判斷的規則,都可以作為分類標准

下面我們用圖像壓縮作為例子來解釋一下。最左邊是一張彩色照片,大小約1Mb,通過壓縮可以把它變成幾十到幾百Kb,這就是壓縮軟件的實現過程。那么壓縮軟件的實現原理是什么呢?其中一種就是聚類算法。

從原始圖片到壓縮存儲的過程如下圖所示:

聚類算法同樣可以用於圖像分割。圖像中每一個像素點是一個3維向量,對應 [R, G, B] 像素值。給定聚類中類別個數K,算法用K個不同的顏色來表示原來的圖像,每個像素點用K個顏色中一個表示。具體如下:

對於文檔、新聞、商品而言,很多時候我們會使用嵌套的歸類方法,這是一種層次化聚類:

3)主流聚類算法

我們先對聚類算法做個了解,主流的聚類算法可以分成兩類:划分聚類(Partitioning Clustering)和層次聚類(Hierarchical Clustering)。他們的主要區別如圖中所示:

划分聚類算法會給出一系列扁平結構的簇(分開的幾個類),它們之間沒有任何顯式的結構來表明彼此的關聯性

  • 常見算法有 K-Means/K-Medoids、Gaussian Mixture Model (高斯混合模型)、Spectral Clustering(譜聚類)、Centroid-based Clustering等。

層次聚類會輸出一個具有層次結構的簇集合,因此能夠比划分聚類輸出的無結構簇集合提供更豐富的信息。層次聚類可以認為是是嵌套的划分聚類。

  • 常見算法有 Single-linkage、Complete-linkage、Connectivity-based Clustering等。

這兩類算法在聚類過程中用到的具體算法不一樣,后文我們會重點展開講一下K-Means算法、Single-linkage算法和Complete-linkage算法。

2.K-Means聚類算法

K-Means算法是聚類算法中一個非常基礎的算法,同時應用又非常廣泛,下面ShowMeAI給大家展開講解算法原理。

1)K-Means算法核心概念

我們提到了聚類算法要把n個數據點按照分布分成k類(很多算法的k是人為提前設定的)。我們希望通過聚類算法得到k個中心點,以及每個數據點屬於哪個中心點的划分。

  • 中心點可以通過迭代算法來找到,滿足條件:所有的數據點到聚類中心的距離之和是最小的。

  • 中心點確定后,每個數據點屬於離它最近的中心點。

在進入「如何尋找中心點」這個核心問題之前,我們先解決幾個小問題:

Q1:數據點到中心點的距離如何計算

  • 我們一般選擇幾何距離,就是L2距離的平方。

Q2:中心點是否唯一,或者說,是不是存在全局最優解

  • 對於多個中心點的情況,全局最優是一個相當難的問題。理論上存在一個全局最優解,但是不一定能找到。既然全局最優解不好找,那我們退而求其次,看能不能找到局部最優解。

Q3:聚類結果如何表示

  • 采用空間分割的方式:將空間分割成多個多邊形,每個多邊形對應一個cluster中心。

2)K-Means算法步驟

K-Means采用EM算法迭代確定中心點。流程分兩步:

  • ① 更新中心點:初始化的時候以隨機取點作為起始點;迭代過程中,取同一類的所有數據點的重心(或質心)作為新中心點。

  • ② 分配數據點:把所有的數據點分配到離它最近的中心點。

重復上面的兩個步驟,一直到中心點不再改變為止。過程如圖所示:

  • 左側Assignments:一開始隨機選取三個點,作為三個類的中心,基於其它點和這三個中心點的距離分配簇;每一類重新計算和分配中心。

  • 右側Refitted Means:根據新的中心點,重新分配所有的數據點(原來屬於綠色中心點的1個點,此次迭代后變成屬於紅色中心點了)。

下圖的示例展示了K-Means動態迭代收斂的過程:

  • 圖(a)上有一群散落的點,我們設定簇數K=2。

  • 圖(b)為隨機找2個點作為中心初始化后,第一次分類的結果。

    • 可以看到,紅藍分界線在這群點的中央穿過。這顯然有問題,不過沒關系,算法繼續往下走。對紅藍兩類分別計算它們的中心。
  • 圖(c)可以看到,一個落在左下方這一團里,另一個落在右上方那一團里。以新的中心點進行第二次分類。

  • 圖(d)的分界線就基本是已經可以把兩團分開了。

  • 圖(f)、(g)顯示后續重復計算你「中心點-分類數據點」的過程已經收斂,數據點分配基本不動了,聚類完成。

下方的動圖能更清晰地展示這個過程:

3.K-Means缺點與改進

1)K-Means算法缺點

K-Means算法簡單易用,它有什么缺點呢?我們將K-Means算法的一些缺點總結如下:

  • 缺點1:中心點是所有同一類數據點的質心,所以聚類中心點可能不屬於數據集的樣本點。

  • 缺點2:計算距離時我們用的是L2距離的平方。對離群點很敏感,噪聲(Noisy Data)和離群點(Outlier)會把中心點拉偏,甚至改變分割線的位置。

2)K-Medoids算法

針對K-Means算法的缺點改進得到了K-Medoids算法:

(1)限制聚類中心點必須來自數據點。

  • 求中心點的計算方法,由原來的直接計算重心,變成計算完重心后,在重心附近找一個數據點作為新的中心點。

  • K-Medoids重擬合步驟比直接求平均的K-Means要復雜一些。

(2)為避免平方計算對離群點的敏感,把平方變成絕對值。

總結來說,K-Medoids算法的迭代過程與K-Means是一致的,不同點如下所示:

  • 起始點不是隨機點,而是任意選擇數據集中的點。

  • 距離使用L1距離,而不是L2距離。

  • 新的中心點,也不是同類所有點的重心,而是同一類別所有數據點中,離其它點最近的點。

  • 復雜度方面,相比於K-Means的 \(O(n)\) ,K-Medoids更新中心點的復雜度 \(O(n^2)\) 要更高一些。

下圖是K-Means和K-Medoids兩個算法的一個系統對比:

4.層次聚類算法

相比於K-Means這類划分聚類,我們有另外一類層次化聚類算法。

1)層次聚類vs划分聚類

划分聚類得到的是划分清晰的幾個類,而層次聚類最后得到的是一個樹狀層次化結構。

從層次化聚類轉換為划分聚類很簡單,在層次化聚類的某一層進行切割,就得到1個划分聚類。如下圖所示:

2)Single-Linkage 算法

接下來我們介紹一個層次聚類中的Single-Linkage算法。這個算法是構造一棵二叉樹,用葉節點代表數據,而二叉樹的每一個內部節點代表一個聚類。如圖所示:

這是一個從下而上的聚類。這棵樹是先有葉子,順着葉子逐漸長樹枝,樹枝越長越大一直到樹根。

如果葉子很多,這個生長過程需要合並的類就會很多。圖中有11個數據點,一共發生了10次合並。

3)Complete-Linkage算法

與Single-Linkage算法相似,Complete-Linkage的迭代思路是一樣的,不同的是在合並類時,Single-Linkage是用兩個類中距離最小的兩個點作為類之間的距離,而Complete-Linkage恰恰相反,用距離最遠的兩個數據點之間的距離作為這兩個類之間的距離。

這兩種計算方法各有利弊。總的來說,層次聚類的計算復雜度是 \(O(n^3)\) 級別,算是很高的了。可以用優先隊列的數據結構對算法加速,加速后能減低到 \(O(n^{2} \log{n} )\) 的級別。

5.DB-SCAN算法

1)DB-SCAN算法

在前面的內容中我們介紹了划分聚類和層次聚類的算法,接下來我們學習另外一個聚類算法:DB-SCAN算法。

DB-SCAN是一個基於密度的聚類。如下圖中這樣不規則形態的點,如果用K-Means,效果不會很好。而通過DB-SCAN就可以很好地把在同一密度區域的點聚在一類中。

2)DB-SCAN算法的關鍵概念

核心對象(Core Object),也就是密度達到一定程度的點。

  • \(x_j\)\(\in -\)鄰域至少包含MinPts個樣本,即\(|N_\in (x_j )|≥MinPts\),則\(x_j\)是一個核心對象。

密度直達(directly density-reachable),密度可達(density-reachable):核心對象之間可以是密度直達或者密度可達。

  • \(x_i\)位於\(x_j\)\(\in -\)鄰域中,且\(x_j\)是核心對象,則稱\(x_j\)\(x_j\)密度直達。

  • \(x_i\)\(x_j\),若存在樣本序列\(p_1,p_2, \dots, p_n\),其中\(p_1=x_i\)\(p_n=x_j\)\(p_i+1\)\(p_i\)密度直達,則稱\(x_j\)\(x_i\)密度可達。

密度相連(density-connected):所有密度可達的核心點就構成密度相連。

  • \(x_i\)\(x_j\),若存在\(x_k\)使得\(x_i\)\(x_j\),均由\(x_k\)密度可達,則稱\(x_i\)\(x_j\)密度相連。

我們通過下圖深入理解一下剛才提到的幾個基本概念。

先假設要求的最小點密度MinPts是3。

  • 在一個半徑范圍內,\(x_1\)這個點周圍的點數是5,超過了閾值3,所以\(x_1\)是一個核心對象。同樣,\(x_2\)\(x_3\)\(x_4\)也是核心對象。

  • \(x_1\)\(x_2\)處於一個鄰域,所以二者是密度直達的關系,而\(x_3\)\(x_2\)也是密度直達的關系,通過\(x_2\)\(x_1\)\(x_3\)是密度可達的關系。

  • \(x_3\)\(x_4\)通過多個核心對象實現密度相連。

3)DB-SCAN算法偽代碼

這個過程用直白的語言描述就是:

  • 對於一個數據集,先規定最少點密度MinPts和半徑范圍。

  • 先找出核心對象:如果在半徑范圍內點密度大於MinPts,則這個點是核心對象。把所有的核心對象放到一個集合中。

  • 從這個核心對象集合中,隨機找一個核心對象,判斷其它的數據點與它是否密度直達,如果是,則歸入聚類簇中。

  • 繼續判斷其它點與聚類簇中的點是否密度直達,直到把所有的點都檢查完畢,這時候歸入聚類簇中的所有點是一個密度聚類。

更多無監督學習的算法模型總結可以查看ShowMeAI的文章 AI知識技能速查 | 機器學習-無監督學習

視頻教程

可以點擊 B站 查看視頻的【雙語字幕】版本

【雙語字幕+資料下載】MIT 6.036 | 機器學習導論(2020·完整版)

https://www.bilibili.com/video/BV1y44y187wN?p=13

機器學習【算法】系列教程

機器學習【實戰】系列教程

ShowMeAI系列教程推薦


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM