今天要跟大家分享的是聚類分析(cluster analysis),又稱為集群分析、群分析等,是一種統計方法。這種統計方法常用在商業上、電腦科學、生物學和經濟學等領域,也是在做語言分析和 NLP 相關任務這種和語言相關的分析時時常用的方法,可以說用途非常廣泛。因此本篇將簡單介紹聚類分析並實作任務。
cluster analysis 是一種精簡資料的方法,主要目的是將一大筆資料依據樣本之間的共同屬性精簡成少數幾個同質性次群體 homogeneous subgroups ,即以相似性 similarity 衡量,形成集群(cluster),以便從雜亂無章的一大堆原始資料中,做到分類、分群的目標。而所謂的相似性通常是以「距離」作為衡量,相對距離愈近,相似程度愈高,分群之後可以使得群內差異小、群間差異大。
集群分析有許多分析方式,最常見的就是階層式集群分析法(hierarchical method),這種分析方式又可以細分為兩種方向,分別是凝聚分層法(agglomerative hierarchical clustering)和分離分層法(divisive hierarchical clustering。凝聚分層法是在最開始把單一個體視為一個群,根據相似性將距離最近的兩個個體合成一群,一步步地使群組越變越少,最後所有的個體結合成一群的方式,屬於下層到上層的分群方式(bottom-up),也是常用的方式。分離分層法的分群方式與凝聚分層法恰恰相反,在最開始所有個體通通結合成單一個群,根據相似性將距離最遠的兩個個體分開來,一步步地使群組越變越多,最後所有的個分成一群一群的方式,屬於上層至下層的分群(top-down),此方式較為少用。下圖示意凝聚分層法(反過來看就是分離分層法)。
圖片資料來源(https://www.displayr.com/what-is-hierarchical-clustering/)
依照其不同「群間距離」計算方式,又可分為以下四種計算方法:
非階層式集群分析法就是將原有的集群打散,並重新形成新的集群的方式,最常見的就是 K 平均數(K-means)集群分析法。K-Means 算法通過找到群心點來確定群的存在。群心點是集群中所有資料點的平均值。通過迭代評估資料集中每個點之間的歐式距離(直線距離),可以將每個點分配給一個集群。群心點一開始是隨機的,並且每次執行該過程時都會發生變化。整體過程如下圖所示。
選定K個初始集群的中心,其中K是欲分群的數目。
計算每個觀察值到各集群中心的距離遠近,將每一個觀察值分配到離其最近的集群內。
根據事先假定的調整規則,重新分配每一個觀察值到K組集群中。
如果重新分配的資料點能滿足調整規則條件,則重複步驟(2)、(3),直到資料點無法重新配置為止。
說了那麼多,我們來用 R 快速實作一下吧!這邊使用的是 Herachical clustering 的方式。
library(iris) # 是的,又是鳶尾花資料集
# 計算矩陣資料的 row 之間的距離
distance = dist(iris[,3:4]) # default: Euclidean
# 使用 HCA
# the default linkage is "complete" linkage
clusters = hclust(distance); clusters # 在 hclust() 裡面多加一個 method = '計算方式' 這個參數就能替換 default 了!如 hclust(distance, method = 'average')
執行結果為:
Call:
hclust(d = distance)
Cluster method : complete
Distance : euclidean
Number of objects: 150
# 畫出 cluster 的結果
plot(clusters)
執行結果為:
是不是覺得分太多了呢?我們幫它修剪一下,分成最主要的 3 群。
clusterCut <- cutree(clusters, 3)
接下來我們將修剪後的分群結果畫出來,並和原本的資料點擬合,看看分群的結果如何吧!
# 原本的資料點圖 + 分群的資料點圖
ggplot(iris, aes(Petal.Length, Petal.Width, color = Species)) +
geom_point(alpha = 0.4, size = 3.5) + geom_point(col = clusterCut) +
scale_color_manual(values = c('black', 'red', 'green'))
執行結果為:
今天就到這邊~明天見!