階層式分群(Hierarchical Clustering)

階層式分群

階層式分群(Hierarchical Clustering)屬於非監督式學習,用於分群問題。將資料不斷地分裂或聚合,直到想要的群數。分裂表示資料由上到下(top-down)方式進行分群,將整體資料視為一體,再依序分裂成兩群,再將兩群,其中一群分裂成兩群,就會分裂成三群,直到想要的群數;聚合表示資料由下到上(bottom-up)方式進行分群,依照距離不斷將兩個資料或群,組合成一個更大的群,直到想要的群數,本單元使用聚合方式建立階層式分群。

9-1 階層式分群的運作過程

階層式分群的運作過程,如下。

Step1)每個資料視為一群,假設有n個資料,就會有n群。

Step2)找到所有群距離最短的兩群,將兩群聚合成一群

Step3)假設群數仍然大於目標群數,不斷重複Step2直到群樹到達目標群數。

以上範例,先將(2,8)與(2,9)分成同一群,再將(2,2)與(1,2)分成同一群,接著在[(2,2),(1,2)]這一群加入(0,2),形成[(2,2),(1,2),(0,2)]群,以此類推,直到所需要的群數。假設分成三群,則這三群為[(2,8), (2,9)]、[(9,3))]、[(4,3), (0,4), (2,2), (1,2), (0,2)]。

9-2 使用sklearn實作階層式分群

使用sklearn實作階層式分群,將每筆資料輸入階層式分群模型就可計算出每筆資料的所在群組。使用sklearn實作階層式分群的步驟如下。

(1)輸入資料

X = data

(2)建立模型

model=AgglomerativeClustering(n_clusters=3,affinity='euclidean',linkage='ward')

參數n_clusters表示要分成幾群。參數affinity用於設定計算距離的方式,分成manhattan、cosine、l1、l2、euclidean。參數linkage設定計算群與群之間距離的方式,分成single、complete、average、ward。

(3)訓練模型與模型預測

model.fit_predict(X)

9-3 階層式分群實作範例

9-3-1 使用階層式分群預估鳶尾花種類

(9-3-1應用階層式分群於鳶尾花資料集.ipynb)

使用萼片長度與萼片寬度經由階層式分群預估鳶尾花種類,本範例測資來自於sklearn.datasets的函式load_iris下載鳶尾花資料,匯入程式如下。

from sklearn.datasets import load_iris

iris = load_iris()

Step1)匯入資料

使用sklearn.datasets的函式load_iris匯入資料到DataFrame。

程式說明

第1到5行:匯入函式庫。

第6行:使用函式load_iris匯入鳶尾花資料集到變數iris。

第7行:讀取鳶尾花資料集的data到變數X。

第8行:取出X第1到2欄資料。

第9行:使用函式head顯示變數df前五筆資料。

Step2)檢查資料

檢查資料是否有空值、資料維度大小、欄位名稱、第一筆資料內容。

程式說明

第1行:使用函式isnull檢查資料是否有空值,如果欄位有空值就會回傳True,轉換成數值1,加總結果就會是空值個數。

第2到4行:使用shape顯示資料的筆數,函式keys顯示欄位名稱,iloc顯示指定範圍的資料內容。

Step3)建立模型

使用AgglomerativeClustering建立模型。

程式說明

第1行:使用AgglomerativeClustering建立階層式分群,設定n_clusters為3,表示分成3群,設定affinity為「euclidean」,表示使用euclidean計算距離,設定linkage為「ward」,表示使用ward計算群與群之間距離。

Step4)訓練模型與預測模型

使用fit_predict訓練模型與預測模型。

程式說明

第1行:以X為輸入,使用函式fit_predict進行訓練模型與預測模型。

Step5)繪製分群結果圖

輸入資料到模型進行預測,並繪製分群結果的散佈圖。

程式說明

第1行:使用模型model預估輸入X的分群結果到變數y。

第2行:使用函式scatter繪製散佈圖,以X[[0]]為X軸座標,X[[1]]為Y軸座標,設定顏色c為變數y。

Step6)使用其他距離公式進行分群

更換模型的參數affinity與linkage,重新進行訓練模型與預測模型。

程式說明

第1行:使用AgglomerativeClustering建立階層式分群,設定n_clusters為3,表示分成3群,設定affinity為「manhattan」,表示使用manhattan計算距離,設定linkage為「average」,表示使用average計算群與群之間距離。

第2行:使用模型model預估輸入X的分群結果到變數y。

第3行:使用函式scatter繪製散佈圖,以X[[0]]為X軸座標,X[[1]]為Y軸座標,設定顏色c為變數y。

Step7)使用scipy進行階層式分群,並繪製樹狀圖

使用scipy進行階層式分群,透過scipy可以劃出樹狀圖。

程式說明

第1行:匯入函式庫。

第2行:使用linkage建立階層式分群,設定metric為「euclidean」,表示使用euclidean計算距離,設定method為「ward」,表示使用ward計算群與群之間距離。

第3到6行:設定繪圖尺寸為寬12公分高8公分,使用函式dendrogram建立模型的樹狀圖,設定樹狀圖標題為「Hierarchical Clustering」,顯示繪圖結果。