快速學(xué)會一個機器學(xué)習(xí)算法:層次聚類法
在機器學(xué)習(xí)領(lǐng)域,聚類分析是一種重要的無監(jiān)督學(xué)習(xí)方法,廣泛應(yīng)用于數(shù)據(jù)挖掘、圖像處理、市場細分等多個領(lǐng)域。本文將深入探討層次聚類算法,包括其基本介紹、算法原理以及一個完整的案例分析,幫助讀者全面理解和掌握這一經(jīng)典的聚類方法。
一、算法介紹
1.1 什么是層次聚類
層次聚類(Hierarchical Clustering)是一種通過構(gòu)建層次結(jié)構(gòu)來組織數(shù)據(jù)的聚類方法。與其他聚類算法不同,層次聚類不需要預(yù)先指定簇的數(shù)量,而是通過構(gòu)建一個樹狀結(jié)構(gòu)(樹狀圖,Dendrogram)來展示數(shù)據(jù)的分層關(guān)系。層次聚類主要分為兩類:
- 凝聚層次聚類(Agglomerative Hierarchical Clustering):自底向上,先將每個數(shù)據(jù)點視為一個單獨的簇,然后逐步合并最相似的簇,直到所有數(shù)據(jù)點合并為一個簇或達到預(yù)定的簇數(shù)量。
- 分裂層次聚類(Divisive Hierarchical Clustering):自頂向下,先將所有數(shù)據(jù)點視為一個整體簇,然后逐步分裂成更小的簇,直到每個簇僅包含一個數(shù)據(jù)點或達到預(yù)定的簇數(shù)量。
二、算法原理
層次聚類的核心在于如何衡量簇與簇之間的相似性或距離,以及如何選擇合適的鏈接方法來決定簇的合并或分裂。以下將詳細介紹這些關(guān)鍵概念。
2.3 算法流程
以凝聚層次聚類為例,其基本流程如下:
- 初始化:將每個數(shù)據(jù)點作為一個獨立的簇。
- 計算距離:計算所有簇之間的距離,根據(jù)選擇的鏈接方法確定簇間距離。
- 合并簇:找到距離最近的兩個簇,將它們合并為一個新的簇。
- 更新距離矩陣:更新新簇與其他簇之間的距離。
- 重復(fù)步驟3-4,直到所有數(shù)據(jù)點合并為一個簇,或達到預(yù)定的簇數(shù)量。
三、案例分析
為了更好地理解層次聚類的應(yīng)用,下面我們通過一個具體的案例進行分析。我們將使用Python中的??scikit-learn?
?庫生成模擬數(shù)據(jù),并實現(xiàn)層次聚類算法。
3.1 生成模擬數(shù)據(jù)
我們將生成一個包含三簇數(shù)據(jù)的二維數(shù)據(jù)集,每個簇的數(shù)據(jù)點呈現(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 實現(xiàn)層次聚類
我們將使用??scipy?
??庫中的??linkage?
??和??dendrogram?
?函數(shù)來實現(xiàn)層次聚類,并使用不同的鏈接方法進行比較。
# 2. 構(gòu)建層次聚類模型
linked = linkage(X, method='ward')
# 3. 繪制樹狀圖
plt.figure(figsize=(10, 7))
dendrogram(linked,
orientation='top',
distance_sort='descending',
show_leaf_counts=True)
plt.title("層次聚類樹狀圖(Ward法)")
plt.xlabel("樣本點索引")
plt.ylabel("距離")
plt.show()
3.3 確定簇的數(shù)量
通過觀察樹狀圖,我們可以選擇一個合適的距離閾值來確定簇的數(shù)量。我們選擇將數(shù)據(jù)分為3個簇。
# 4. 確定簇的數(shù)量并進行聚類
n_clusters = 3
cluster = AgglomerativeClustering(n_clusters=n_clusters, linkage='ward')
cluster_labels = cluster.fit_predict(X)
# 5. 可視化聚類結(jié)果
plt.figure(figsize=(8, 5))
plt.scatter(X[:, 0], X[:, 1], c=cluster_labels, cmap='viridis', s=50)
plt.title(f"層次聚類結(jié)果({n_clusters}個簇)")
plt.xlabel("特征1")
plt.ylabel("特征2")
plt.show()
3.5 運行結(jié)果
生成的模擬數(shù)據(jù)圖:
層次聚類樹狀圖:
層次聚類結(jié)果:
通過上述代碼,我們生成了一個二維數(shù)據(jù)集,并使用層次聚類方法將其分為三個簇。樹狀圖清晰地展示了數(shù)據(jù)的分層結(jié)構(gòu),選擇合適的距離閾值后,聚類結(jié)果與真實簇的分布高度吻合,驗證了層次聚類的有效性。
四、總結(jié)
層次聚類作為一種經(jīng)典的聚類方法,具有以下優(yōu)缺點:
優(yōu)點
- 無需預(yù)先指定簇的數(shù)量:通過樹狀圖可以靈活選擇簇的數(shù)量。
- 能夠發(fā)現(xiàn)數(shù)據(jù)的層次結(jié)構(gòu):適用于需要多層次分析的數(shù)據(jù)。
- 適用于不同形狀的簇:尤其是在選擇合適的鏈接方法時。
缺點
- 計算復(fù)雜度高:對于大規(guī)模數(shù)據(jù)集,計算和存儲成本較高。
- 對噪聲和異常值敏感:可能會影響聚類結(jié)果的準(zhǔn)確性。
- 鏈接方法的選擇依賴經(jīng)驗:不同的鏈接方法可能導(dǎo)致不同的聚類結(jié)果。
在實際應(yīng)用中,層次聚類適用于中小規(guī)模的數(shù)據(jù)集,特別是當(dāng)需要理解數(shù)據(jù)的層次結(jié)構(gòu)時。然而,對于大規(guī)模數(shù)據(jù)集,可能需要考慮其他更高效的聚類算法,如K-Means或DBSCAN。
本文轉(zhuǎn)載自??寶寶數(shù)模AI??,作者:BBSM
