快速學(xué)會(huì)一個(gè)機(jī)器學(xué)習(xí)算法:層次聚類(lèi)法
在機(jī)器學(xué)習(xí)領(lǐng)域,聚類(lèi)分析是一種重要的無(wú)監(jiān)督學(xué)習(xí)方法,廣泛應(yīng)用于數(shù)據(jù)挖掘、圖像處理、市場(chǎng)細(xì)分等多個(gè)領(lǐng)域。本文將深入探討層次聚類(lèi)算法,包括其基本介紹、算法原理以及一個(gè)完整的案例分析,幫助讀者全面理解和掌握這一經(jīng)典的聚類(lèi)方法。
一、算法介紹
1.1 什么是層次聚類(lèi)
層次聚類(lèi)(Hierarchical Clustering)是一種通過(guò)構(gòu)建層次結(jié)構(gòu)來(lái)組織數(shù)據(jù)的聚類(lèi)方法。與其他聚類(lèi)算法不同,層次聚類(lèi)不需要預(yù)先指定簇的數(shù)量,而是通過(guò)構(gòu)建一個(gè)樹(shù)狀結(jié)構(gòu)(樹(shù)狀圖,Dendrogram)來(lái)展示數(shù)據(jù)的分層關(guān)系。層次聚類(lèi)主要分為兩類(lèi):
- 凝聚層次聚類(lèi)(Agglomerative Hierarchical Clustering):自底向上,先將每個(gè)數(shù)據(jù)點(diǎn)視為一個(gè)單獨(dú)的簇,然后逐步合并最相似的簇,直到所有數(shù)據(jù)點(diǎn)合并為一個(gè)簇或達(dá)到預(yù)定的簇?cái)?shù)量。
- 分裂層次聚類(lèi)(Divisive Hierarchical Clustering):自頂向下,先將所有數(shù)據(jù)點(diǎn)視為一個(gè)整體簇,然后逐步分裂成更小的簇,直到每個(gè)簇僅包含一個(gè)數(shù)據(jù)點(diǎn)或達(dá)到預(yù)定的簇?cái)?shù)量。
二、算法原理
層次聚類(lèi)的核心在于如何衡量簇與簇之間的相似性或距離,以及如何選擇合適的鏈接方法來(lái)決定簇的合并或分裂。以下將詳細(xì)介紹這些關(guān)鍵概念。

2.3 算法流程
以凝聚層次聚類(lèi)為例,其基本流程如下:
- 初始化:將每個(gè)數(shù)據(jù)點(diǎn)作為一個(gè)獨(dú)立的簇。
- 計(jì)算距離:計(jì)算所有簇之間的距離,根據(jù)選擇的鏈接方法確定簇間距離。
- 合并簇:找到距離最近的兩個(gè)簇,將它們合并為一個(gè)新的簇。
- 更新距離矩陣:更新新簇與其他簇之間的距離。
- 重復(fù)步驟3-4,直到所有數(shù)據(jù)點(diǎn)合并為一個(gè)簇,或達(dá)到預(yù)定的簇?cái)?shù)量。
三、案例分析
為了更好地理解層次聚類(lèi)的應(yīng)用,下面我們通過(guò)一個(gè)具體的案例進(jìn)行分析。我們將使用Python中的??scikit-learn??庫(kù)生成模擬數(shù)據(jù),并實(shí)現(xiàn)層次聚類(lèi)算法。
3.1 生成模擬數(shù)據(jù)
我們將生成一個(gè)包含三簇?cái)?shù)據(jù)的二維數(shù)據(jù)集,每個(gè)簇的數(shù)據(jù)點(diǎn)呈現(xiàn)高斯分布。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from scipy.cluster.hierarchy import dendrogram, linkage
from sklearn.cluster import AgglomerativeClustering
# 1. 生成模擬數(shù)據(jù)
X, y_true = make_blobs(n_samples=50, centers=1, cluster_std=0.60, random_state=0)
# 可視化數(shù)據(jù)
plt.figure(figsize=(8, 5))
plt.scatter(X[:, 0], X[:, 1], s=50, color='gray')
plt.title("模擬數(shù)據(jù)分布")
plt.xlabel("特征1")
plt.ylabel("特征2")
plt.show()3.2 實(shí)現(xiàn)層次聚類(lèi)
我們將使用??scipy???庫(kù)中的??linkage???和??dendrogram??函數(shù)來(lái)實(shí)現(xiàn)層次聚類(lèi),并使用不同的鏈接方法進(jìn)行比較。
# 2. 構(gòu)建層次聚類(lèi)模型
linked = linkage(X, method='ward')
# 3. 繪制樹(shù)狀圖
plt.figure(figsize=(10, 7))
dendrogram(linked,
orientation='top',
distance_sort='descending',
show_leaf_counts=True)
plt.title("層次聚類(lèi)樹(shù)狀圖(Ward法)")
plt.xlabel("樣本點(diǎn)索引")
plt.ylabel("距離")
plt.show()3.3 確定簇的數(shù)量
通過(guò)觀察樹(shù)狀圖,我們可以選擇一個(gè)合適的距離閾值來(lái)確定簇的數(shù)量。我們選擇將數(shù)據(jù)分為3個(gè)簇。
# 4. 確定簇的數(shù)量并進(jìn)行聚類(lèi)
n_clusters = 3
cluster = AgglomerativeClustering(n_clusters=n_clusters, linkage='ward')
cluster_labels = cluster.fit_predict(X)
# 5. 可視化聚類(lèi)結(jié)果
plt.figure(figsize=(8, 5))
plt.scatter(X[:, 0], X[:, 1], c=cluster_labels, cmap='viridis', s=50)
plt.title(f"層次聚類(lèi)結(jié)果({n_clusters}個(gè)簇)")
plt.xlabel("特征1")
plt.ylabel("特征2")
plt.show()3.5 運(yùn)行結(jié)果
生成的模擬數(shù)據(jù)圖:

層次聚類(lèi)樹(shù)狀圖:

層次聚類(lèi)結(jié)果:

通過(guò)上述代碼,我們生成了一個(gè)二維數(shù)據(jù)集,并使用層次聚類(lèi)方法將其分為三個(gè)簇。樹(shù)狀圖清晰地展示了數(shù)據(jù)的分層結(jié)構(gòu),選擇合適的距離閾值后,聚類(lèi)結(jié)果與真實(shí)簇的分布高度吻合,驗(yàn)證了層次聚類(lèi)的有效性。
四、總結(jié)
層次聚類(lèi)作為一種經(jīng)典的聚類(lèi)方法,具有以下優(yōu)缺點(diǎn):
優(yōu)點(diǎn)
- 無(wú)需預(yù)先指定簇的數(shù)量:通過(guò)樹(shù)狀圖可以靈活選擇簇的數(shù)量。
- 能夠發(fā)現(xiàn)數(shù)據(jù)的層次結(jié)構(gòu):適用于需要多層次分析的數(shù)據(jù)。
- 適用于不同形狀的簇:尤其是在選擇合適的鏈接方法時(shí)。
缺點(diǎn)
- 計(jì)算復(fù)雜度高:對(duì)于大規(guī)模數(shù)據(jù)集,計(jì)算和存儲(chǔ)成本較高。
- 對(duì)噪聲和異常值敏感:可能會(huì)影響聚類(lèi)結(jié)果的準(zhǔn)確性。
- 鏈接方法的選擇依賴經(jīng)驗(yàn):不同的鏈接方法可能導(dǎo)致不同的聚類(lèi)結(jié)果。
在實(shí)際應(yīng)用中,層次聚類(lèi)適用于中小規(guī)模的數(shù)據(jù)集,特別是當(dāng)需要理解數(shù)據(jù)的層次結(jié)構(gòu)時(shí)。然而,對(duì)于大規(guī)模數(shù)據(jù)集,可能需要考慮其他更高效的聚類(lèi)算法,如K-Means或DBSCAN。
本文轉(zhuǎn)載自??寶寶數(shù)模AI??,作者:BBSM

















