[Python實作] 層次聚類 Hierarchical Clustering

Hierarchical Clustering 為層次聚類的分群方式,屬於非監督式學習的一種。本單元透過大家所熟悉的鳶尾花資料集,看到在Python裡如何實作層次聚類。文末提供程式檔案,歡迎大家一起下載練習!

(一) 引入模組及準備資料

第一步,我們一樣會引入一些常用的運算及繪圖模組,還有scikit learn裡面所提供的鳶尾花資料及進行資料下載。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn import datasets

今天,為了視覺化,我們僅採用花瓣的長度及寬度當作我們的特徵資料。如果大家手邊有自己的資料,也非常鼓勵採用自己的資料進行實作唷!

iris=datasets.load_iris()
X=iris.data
X=X[:,2:4]

(二) Scikit Learn

今天,我們會分享兩種在python裡層次聚類的分群做法。一種是我們熟悉的scikit learn裡面的模組,另一種則是在scipy模組裡面。

首先我們先來看到sklearn裡面的作法,基本上就是我們所熟悉的機器學習建模流程。

1.引入層次聚類的模組

from sklearn.cluster import AgglomerativeClustering

2.進行分群

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

其中,
n_clusters: 要分成幾群 ,給定數值
affinity: 距離的計算方式,”euclidean”,”l1″,”l2″,”manhattan”,”cosine”…
linkage: 群與群之間的距離,”ward”,”complete”,”average”,”single”

3.分群結果與圖像化顯示

進行預測:

ml.fit_predict(X)

圖像化顯示:

plt.scatter(X[:,0],X[:,1],c=ml.fit_predict(X))

(三) Scipy

在scipy裡面,對於群與群之間距離的計算方式,提供了更多元的算法,除了single, complete, average, ward外,還包含了加權法、中心點法及中位數法等提供選擇。(其實sklearn裡面也可以做到這些,只是自己要另外將該演算法寫成函數)

1.引入層次聚類的模組

import scipy.cluster.hierarchy as sch

2.進行分群,並圖像化整個聚落樹狀圖

進行分群:
dis=sch.linkage(X,metric='euclidean',method='ward')

其中,
metric: 距離的計算方式
method: 群與群之間的計算方式,”single”, “complete”, “average”, “weighted”, “centroid”, “median”, “ward”

sch.dendrogram(dis)
plt.title('Hierarchical Clustering')
plt.show()

3.利用距離決定群數,或直接給定群數。

建構好聚落樹狀圖後,我們可以依照距離的切割來進行分類,也可以直接給定想要分類的群數,讓系統自動切割到相對應的距離。

A. 距離切割

上圖縱軸代表距離,我們可以用特徵之間的距離進行分群的切割。

max_dis=5
clusters=sch.fcluster(dis,max_dis,criterion='distance')

B.直接給定群數

同時,我們也可以像sklearn一樣,直接給定我們所想要分出的群數。

k=5
clusters=sch.fcluster(dis,k,criterion='maxclust')

今天,我們在python裡實作Hierarchical Clustering的兩種方式。大家也可以運用這個方法,針對自己想要分析的資料分群看看唷!

程式檔案,歡迎於此下載

Share

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *